从咖啡店的设计学设计模式 -- 装饰者模式

264 阅读2分钟

故事背景

咖啡店新开张,菜单上有很多种不同口味的咖啡。做法不一样口味不一样。还可以根据用户的喜好加入不同的配料,但是这这一种都要计费,不能卖同一个价钱.......

第一版本

每种饮料对应一个类,每加一种调料就新增一个类,有不同的搭配方式就加一个类......

存在的问题:类爆炸,难以维护

  1. 每次新增产品或者价格修改就要做很多修改
  2. 如果是某种调料价格修改,与之相关的类就要做修改,没完没了

第二版本

将配料的搭配给超类定义,子类只通过有无的方式选择是否加某种调料

存在的问题:行为是通过继承得来的,由父类决定子类的行为

  1. 加入新的调料,超类需要修改,对应的子类也要重新复写对应调料的布尔方法
  2. 子类被迫继承某些不适用的调料
  3. 双倍的调料在这个场景不适用

模式版本

  • 把不同做法的咖啡定义为不同的组件,都继承自 Beverage 这个超类
  • 调料单独定义一个抽象装饰者类,也继承自Beverage
  • 具体的调料继承自调料抽象类

特色

  1. 遵守开发-关闭原则
  2. 应用装饰者模式:动态地将责任附加到对象上,若要拓展功能,装饰者提供了比继承更有弹性的替代方案

特点

  1. 装饰者和被装饰者有同样的超类,所以可以用装饰者代替被装饰者
  2. 可以用一个或者多个装饰者包装被装饰者
  3. 装饰者可以拓展行为也可以拓展状态