故事背景
咖啡店新开张,菜单上有很多种不同口味的咖啡。做法不一样口味不一样。还可以根据用户的喜好加入不同的配料,但是这这一种都要计费,不能卖同一个价钱.......
第一版本
每种饮料对应一个类,每加一种调料就新增一个类,有不同的搭配方式就加一个类......
存在的问题:类爆炸,难以维护
- 每次新增产品或者价格修改就要做很多修改
- 如果是某种调料价格修改,与之相关的类就要做修改,没完没了
第二版本
将配料的搭配给超类定义,子类只通过有无的方式选择是否加某种调料
存在的问题:行为是通过继承得来的,由父类决定子类的行为
- 加入新的调料,超类需要修改,对应的子类也要重新复写对应调料的布尔方法
- 子类被迫继承某些不适用的调料
- 双倍的调料在这个场景不适用
模式版本
- 把不同做法的咖啡定义为不同的组件,都继承自 Beverage 这个超类
- 调料单独定义一个抽象装饰者类,也继承自Beverage
- 具体的调料继承自调料抽象类
特色
- 遵守开发-关闭原则
- 应用装饰者模式:动态地将责任附加到对象上,若要拓展功能,装饰者提供了比继承更有弹性的替代方案
特点
- 装饰者和被装饰者有同样的超类,所以可以用装饰者代替被装饰者
- 可以用一个或者多个装饰者包装被装饰者
- 装饰者可以拓展行为也可以拓展状态