设计模式之--装饰者模式

来源:互联网 发布:java判断全角字符 编辑:程序博客网 时间:2024/06/05 06:02
源码地址:https://github.com/Afengzi/design-pattern/tree/master/src/main/java/com/afengzi/design/decorative
以下讲解及UML类图都是基于上面的例子进行


继承可以扩张功能和行为,但是滥用继承会使子类在编译时期继承到很多不需要的代码。特别是一个父类有多个派生类时,每个派生类都有类似但不同的功能时,往往父类会有这些所有子类的功能,这就使得派生类从父类那继承到了很多不需要的代码。
除了继承之外,还有一种在不改变代码的前提下扩展功能和行为,而且是在运行时动态的附加,就是装饰者模式。

什么是装饰者模式呢?
动态的给对象附加责任和行为,是一种比继承更弹性的设计方案。

装饰者和被装饰者必须是同一种类型,通常是继承同一个抽象类。装饰者也可以作为一个组件,继续被另一个装饰者包装。

装饰者、被装饰者对象都可以被client访问,并且是合法的。因为装饰者同时可能是一个被包装的对象。

装饰者动态的把行为附加给被包装对象,通常是通过委托|组合实现,设计方案更弹性。另外当被包装的类改变时,提供一个新的实现了相同接口的实现类即可,这也是另一个设计原则:OCP(开放-封闭)原则,对扩展功能开放,同时又对修改内部代码封闭。

装饰者和被装饰者必须是同一个类型,利用继承来达到‘类型匹配’,利用委托|组合其他装饰者或者基础组件来动态的附加行为、责任。


在装饰者模式中,难点是如何选择组件(被装饰者)和装饰者。装饰者也可以被另一个装饰者所装饰,如源码中的Mocha,本身可以装饰组件HouseBlend,但是也可以被Milk装饰。所以装饰者和被装饰者必须是同一个类型。

UML类图:













0 0
原创粉丝点击