装饰模式常常被成为包裹模式,就是因为每一个具体装饰类都将下一个具体装饰类或者具体构建类包裹起来。
- 抽象构建(Component)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
- 具体构件(Concrete Component)角色:实现组件对象接口,通常就是被装饰器装饰的对象。
- 装饰(Decorate)角色:持有一个构建(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
- 具体装饰(Concrete Decorator)角色:负责给构建对象“贴上”附加的责任。
装饰模式为对象添加额外责任的方式就像做蛋糕一样,一圈一圈的加上去,中间的面包是核心,是被装饰的对象,是核心任务,外围的都是装饰对象。
按照GOF的说法,Decorator模式的意图是:动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
Decorator模式的效果是:让我们可以创建以decorator对象——负责新的功能的对象——开始的一条对象“链”,并结束于最初的对象。
装饰模式的功能:
- 能够实现动态地为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观。
对象组合:Favor Composition Over Inheritance。装饰模式的思考起点就是这个规则。
装饰器和组件类的关系:
- 装饰器是用来装饰组建的,装饰器一定要实现和组件类一致的接口,保证他们是同一个类型,并具有同一个外观,这样组合完成的装饰才能够递归调用下去。
本质:动态组合。动态是手段,组合是目的。
优点:
- 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
缺点:会产生很多细粒度对象。
装饰模式与策略模式对比:
- 策略模式改变的是对象的内核
- 装饰模式改变的是对象的外壳
- 策略模式是一层调用
- 装饰模式是递归调用
- 可以有机结合
装饰模式与AOP:
- AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向方面编程。
- 面向对象开发中,考虑系统的角度通常是纵向的。
- AOP主要功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
- 主要的意图是:将日志记录、性能统计、安全控制、事务处理、异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非知道业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。