装饰器模式(Decorator Pattern)在不改变原有功能基础上新增功能,属于结构型模式,是对现有类的一个包装。
就新增功能来说,用装饰器模式比直接生成子类更加灵活。
何时使用:在不想增加很多子类的情况下。
使用场景:1、扩展一个类的功能。2、动态增加功能,动态撤销。
应用实例
-
打地基,打好地基后,后期可以根据需要新增一层楼或者两层楼就可以看后面情况。
-
Java IO流的读写操作
实现方式
看如上类图即可对怎么实现装饰模式有一个清晰的了解了。
Component:抽象组件,可以看成被装饰类的抽象接口
ConcreteComponent:被装饰的类,接口的具体实现
然后要怎么做才能不通过继承而对ConcreteComponent附件功能呢?
如上图可以先定义一个Decorator(抽象的装饰类),然后要附加什么功能通过ConcreteDecorator实现。
然后继续分析,Decorator对Component进行了实现。为什么要实现呢?
因为要能替代被装饰的类(ConcreateComponent),所以要实现同一接口。
实现了同一接口之后呢,难道再把ConcreateComponent里的功能逻辑再写一遍?
当然不,因此就要把被装饰类作为抽象装饰类的成员变量,这样在装饰类中就能调用原有方法。
把被装饰类作为抽象装饰类的成员变量,注入对象可以通过set方法或者构造函数传入。(IO流的底层读写就是通过构造传入)
全部评论