源码地址:
https://github.com/Afengzi/design-pattern/tree/master/src/main/java/com/afengzi/design/decorative
以下讲解及UML类图都是基于上面的例子进行
除了继承之外,还有一种在不改变代码的前提下扩展功能和行为,而且是在运行时动态的附加,就是装饰者模式。
什么是装饰者模式呢?
动态的给对象附加责任和行为,是一种比继承更弹性的设计方案。
装饰者和被装饰者必须是同一种类型,通常是继承同一个抽象类。装饰者也可以作为一个组件,继续被另一个装饰者包装。
装饰者、被装饰者对象都可以被client访问,并且是合法的。因为装饰者同时可能是一个被包装的对象。
装饰者动态的把行为附加给被包装对象,通常是通过委托|组合实现,设计方案更弹性。另外当被包装的类改变时,提供一个新的实现了相同接口的实现类即可,这也是另一个设计原则:OCP(开放-封闭)原则,对扩展功能开放,同时又对修改内部代码封闭。
装饰者和被装饰者必须是同一个类型,利用继承来达到‘类型匹配’,利用委托|组合其他装饰者或者基础组件来动态的附加行为、责任。
在装饰者模式中,难点是如何选择组件(被装饰者)和装饰者。装饰者也可以被另一个装饰者所装饰,如源码中的Mocha,本身可以装饰组件HouseBlend,但是也可以被Milk装饰。所以装饰者和被装饰者必须是同一个类型。
UML类图: