Head First设计模式读书笔记-第三章 Decorator Pattern 装饰者模式
装饰者模式
随笔:
1.利用组合(Composition)和委托(delegation)使得运行时具有继承行为的效果;
2.利用继承设计子类的行为,是编译时静态决定的,而且所有的子类都会继承相同的行为;如果利用组合的做法扩展对象的行为,就可以运行时动态地扩展。
3.开闭原则需要遵循,但并不是所有的设计都要用到开闭原则,因为这样做的话,需要浪费大量的时间,得不偿失,而且过分追求完美也是一种缺陷。
特点:
- 装饰者和被装饰者有相同的超类型;
- 可以用一个或多个装饰者包装一个对象
- 装饰者和被装饰者有相同的超类型,在任何需要原始类型或被包装的场合,都可以用被装饰的对象替代它;
- 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
定义
装饰者模式—动态地将责任附加到对象身上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案。
示例
以设计咖啡为例:
咖啡加入不同的调料需要不同的价格,计算的时候需要将所有的价格加进来。这时候使用继承并不适合。
- 咖啡组合的饮料Beverage有很多种,但是调料的种类范围是固定的,不能因为加多种调料而将组合后的咖啡当作类处理,这里适合使用装饰者。
- 子类继承父类Beverage是为了获得相同的类型和行为,方便装饰
- 装饰类继承父类,是为了获取相同的类型,因为循环增强的时候,类型需要一致。
- 每个装饰类继承自CondimentDecorator,统一类型和行为
类的UML类图
Java IO中的InputStream使用了装饰者模式
第三章总结
OO基础
抽象、封装、多态、继承
OO原则
封装变化
多用组合、少用继承
针对接口编程、不针对实现编程
为交互对象之间的松耦合设计努力
对扩展开放,对修改关闭
OO模式
装饰者模式—动态将责任附加到对象身上。想要扩展功能,装饰者提供有别于继承的另一种选择