装饰(包装)模式

意图
装饰模式可在不改变原有对象的行为下,扩展其行为;
提供了比继承更有弹性的替代方案;

动态地给一个对象添加一些额外的职责;

别名:包装器(Wrapper)模式

来自Head First

  1. 装饰者和被装饰对象有相同的类型,这样客户端对象就可以用和真实对象相同的方式和装饰对象交互;
  2. 可用一个或多个装饰者包装一个对象;
  3. 在任何需要原始对象(被包装)的场合,可用装饰过的对象代替它(扩展原始对象的行为);
  4. 装饰者可在所委托被装饰者的行为之前或之后,加上装饰后的行为,以达到目的;
  5. 对象可在任何时候,被装饰,所以可以在运行时动态地、不限量的装饰者来装饰对象;
    6.装饰对象包含一个真实对象的引用;

示例类图:

装饰(包装)模式_第1张图片
Paste_Image.png

也可以将 被包装的类,放入 Decorator基类中,并设置成 protected类型的变量,这样做,其实更好,子类,就不需要维护 wrapped 对象了;

装饰(包装)模式_第2张图片
Paste_Image.png

装饰者模式中的角色

  1. 被装饰者抽象(Component):是一个抽象接口,或抽象类,也是该模式中的最元素的对象了;
  2. 被装饰者具体实现(ConcreteComponent),也是上图中的ComponentA;
    要装饰的就是这个具体的实现类,可以有多个,具体实现类,如: java io 体系;
  3. 装饰者基类(Decorator)可以是一个抽象类,或者类,用来实现被装饰者抽象(Component)中的方法,实现是通过 Componet 对象的引用来实现的;
  4. 装饰者实现,如上图中的(DecoratorA 与 DecoratorB)是具体的装饰者类,用来装饰最基本的类,如:ComponentA;

你可能感兴趣的:(装饰(包装)模式)