1、对应的设计原则:类应该对扩展开放,对修改关闭。
2、装饰者模式:动态地将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。(个人理解:动态的用一个或者多个装饰者装饰对象,且对象与装饰者来源于同一个超类)
3、类图如下:
说明:
装饰者和被装饰对象有相同的超类型。
可以用一个或者多个装饰者包装一个对象。
装饰者可以在被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
对象可以在任何时候被装饰,即在运行时动态地、不限量地用装饰者来装饰对象。
4、例子
以咖啡为例,我们以饮料为主题,然后在运行时以调料来装饰饮料。
4.1 类图如下:
4.2 代码实现:暂时省略
5、JAVA API中的装饰者模式
6、优点
(1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除 掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
个人理解:动态扩展对象功能,通过不同的装饰类组合创建不同的对象,减少了继承带来的类爆炸。
7、缺点
装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂