定义
装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。
应用场景
- 需要大量的子类为某一个对象进行职责增强的时候,可以使用装饰器模式
- 希望使用继承对于类进行动态扩展的时候,可以考虑使用装饰器模式
装饰器模式的优点
- 装饰类的公用类不再需要设置抽象的方法,使得装饰实现子类也不在依赖抽象父类的抽象方法
- 既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,就可以用装饰过的对象代替它。
- 装饰类和被装饰类的扩展和实现都是解耦的,不需要互相关注实现细节,装饰子类可以独自实现方法
装饰器模式的缺点
- 本质上还是继承结构,而且装饰类和被装饰类必须有相同的顶级父类接口
- 装饰类在系统越来越复杂之后会出现明显的膨胀。
- 装饰者很容易出现大量的小类,这让了解代码的人不容易清楚不同装饰的设计
- 装饰者互相嵌套可能会增加代码的复杂度,也增加扩展装饰者子类的复杂度,最终这个难题会变成调用者的难题
装饰器模式示例代码
抽象构件(Component)角色:所有被装饰组件及装饰器对应的接口标准,指定进行装饰的行为方法。
示例:
1 | public interface Component { |
具体构件(ConcreteComponent)角色:需要被装饰的组件,实现组件接口标准,只具备自身未被装饰的原始特性。
示例:
1 | public class ConcreteComponent implements Component { |
装饰(Decorator)角色:装饰器的高层抽象类,同样实现组件接口标准,且包含一个被装饰的组件。
示例:
1 | public class Decorator implements Component { |
具体装饰(ConcreteDecorator)角色:继承自装饰器抽象类的具体子类装饰器,可以有多种实现,在被装饰组件对象的基础上为其添加新的特性。
示例:
1 | public class ConcreteDecoratorA extends Decorator { |
客户端代码示例:
1 | public class Client{ |
实际案例网上很多,在此不赘述…