Head First设计模式读书笔记-第三章 Decorator Pattern 装饰者模式

装饰者模式

随笔:

1.利用组合(Composition)和委托(delegation)使得运行时具有继承行为的效果;

2.利用继承设计子类的行为,是编译时静态决定的,而且所有的子类都会继承相同的行为;如果利用组合的做法扩展对象的行为,就可以运行时动态地扩展。

3.开闭原则需要遵循,但并不是所有的设计都要用到开闭原则,因为这样做的话,需要浪费大量的时间,得不偿失,而且过分追求完美也是一种缺陷。

 

 

特点:

  1. 装饰者和被装饰者有相同的超类型;
  2. 可以用一个或多个装饰者包装一个对象
  3. 装饰者和被装饰者有相同的超类型,在任何需要原始类型或被包装的场合,都可以用被装饰的对象替代它;
  4. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。

 

定义

装饰者模式—动态地将责任附加到对象身上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案。

示例

以设计咖啡为例:

咖啡加入不同的调料需要不同的价格,计算的时候需要将所有的价格加进来。这时候使用继承并不适合。

  1. 咖啡组合的饮料Beverage有很多种,但是调料的种类范围是固定的,不能因为加多种调料而将组合后的咖啡当作类处理,这里适合使用装饰者。
  2. 子类继承父类Beverage是为了获得相同的类型和行为,方便装饰
  3. 装饰类继承父类,是为了获取相同的类型,因为循环增强的时候,类型需要一致。
  4. 每个装饰类继承自CondimentDecorator,统一类型和行为

Head First设计模式读书笔记-第三章 Decorator Pattern 装饰者模式

 

类的UML类图

Head First设计模式读书笔记-第三章 Decorator Pattern 装饰者模式

 

Java IO中的InputStream使用了装饰者模式

Head First设计模式读书笔记-第三章 Decorator Pattern 装饰者模式

Head First设计模式读书笔记-第三章 Decorator Pattern 装饰者模式

第三章总结

OO基础

抽象、封装、多态、继承

OO原则

封装变化

多用组合、少用继承

针对接口编程、不针对实现编程

为交互对象之间的松耦合设计努力

对扩展开放,对修改关闭

OO模式

装饰者模式—动态将责任附加到对象身上。想要扩展功能,装饰者提供有别于继承的另一种选择