现有问题: 如何动态的增加功能,即对原有功能进行增强。
方案1: 利用Java的继承方式来实现,但若继承层次过深或者增加功能过多,会导致继承爆炸,扩展性低,后续也很难维护,本质上属于继承方式
方案2: 组合优于继承的思想,使用组合来进行增强。底层就是委托技术
。
特点:
- 装饰器类和原始类实现相同的接口,或继承相同的父类,这样可以实现所谓的套娃功能;
- 对原始功能的增强。代理设计模式是对与原始类无关的功能进行增强,而装饰器是对跟原始类相关的功能进行的增强。
与代理模式的区别:
- Proxy模式体现的
封装性
,隐藏细节;Decorator模式体现的是动态性
,显式的增加功能; - Proxy只能增加一种功能;Decorator可以动态的进行多重功能的叠加,扩展性好;
- 设计者是否感知。若设计者需要感知,则使用Decorator模式,否则使用Proxy模式
- Proxy增加的是
原始类无关
的功能; Decorator增加的是与原始类相关
的功能。
优点:
- 动态组合功能。根据不同的条件,在运行期可以动态组合不同的功能;
- 功能复用 。每个装饰器负责一个功能,满足单一职责,同时也方便功能的复用。
缺点: 会产生很多的细粒度对象。
开源框架中的应用:
- JDK的IO流设计
- Mybatis中的Cache设计