0%

三、装饰者模式

引言

有一家咖啡店,需要设计一个订单系统,一开始的饮料设计如下:

62255575

但是,购买咖啡时,也可以加入各种调料。咖啡店会根据不同的调料收取不同的费用。因此需要对设计进行改造。
62518283

一种咖啡配合任意种调料作为一种新的饮料,这简直就是类爆炸,并且非常难以维护。

开闭原则:类应该对扩展开放,对修改关闭

初识装饰者模式

在这里,我们使用不一样的做法:我们要以饮料为主体,然后运行时以调料来装饰饮料。比如说,如果顾客想要摩卡和奶泡深培咖啡,那么要做的是:

  • 拿一个深培咖啡(DarkRoast)对象。
  • 以摩卡(Mocha)对象装饰它
  • 以奶泡对象(Whip)装饰它
  • 调用cost()方法,并依赖委托将调料的价格加上去。

以装饰者构造饮料订单

  • 以DarkRoast对象开始
    63877539

  • 顾客想要摩卡(Mocha),所以建立一个Mocha对象,并用它将DarkRoast对象包起来
    64043519

  • 顾客想要奶泡(Whip),所以需要建立一个Whip对象,并用它将Mocha对象包起来。
    64178210

  • 通过最外圈装饰者(Whip)的cost()就可以计算出总的价钱了。
    64326654

小结

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

定义装饰者模式

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

装饰饮料

68693233

源码:https://github.com/chentianming11/design-pattern
decorator包!