设计模式(三)装饰者模式

利用装饰者模式,我们可以将功能封装在装饰者内部,并且在装饰者内部持有一个被装饰者对象。对装饰者的方法进行调用之后,再调用被装饰者的方法,这样我们就合并了装饰者和被装饰者的功能。这里的方法就是被装饰的“责任”

装饰者模式

定义

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

UML结构

类关系说明

  1. Beverage为抽象组件,作为装饰者和被装饰者的基类,抽象了共同接口cost()
  2. DarkRoast作为具体组件,这是我们将要进行其扩展功能的类
  3. CondimentDecorator作为抽象装饰者,继承于Beverage,并定义了装饰器的接口方法getDescription()用于输出装饰者的描述
  4. Soy、Mocha作为装饰者,扩展了抽象装饰者CondimentDecorator。各自实现了装饰器和被装饰器公共方法:cost(),被装饰者作为参数从构造方法传入,被装饰者持有,等待装饰者使用(通过转发方法调用的形式,扩展其功能)
  5. 每个装饰者和被装饰者的功能都是对修改关闭的,但我们利用组合的方式将被装饰者和装饰者,对被装饰者的功能实现了扩展开放

总结

装饰者模式遵循以下原则:

  1. 对扩展开放,对修改关闭。设计系统时,要适当利用该原则,好让关闭的部分和新扩展的部分隔离。
  2. 装饰者可以在被装饰者的行为前面或后面加上自己的行为,甚至把被装饰者的行为取代掉,从而达到对特定目的的扩展

源码地址

design_pattern_learn