1、定义
装饰者模式:在不必改变原类和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象
2、实际应用
星巴克的咖啡系统项目:
星巴克要求的各种下单功能:大杯原味、大杯加糖、大杯加奶;中杯原味、中杯加糖、中杯加奶;小杯原味、小杯加糖、小杯加奶。当需要同时加奶、加糖的时候。
这种需求要是通过继承的方式就不太好实现,因为咖啡制作过程是动态变化的。例如有的需要原味咖啡,有的需要加奶咖啡,有的需要加糖咖啡,而有的需要先加奶再加糖咖啡,而有的需要先加糖再加奶的咖啡,。。。这是一个排列组合问题,如果使用类继承的方式实现,必须预先将所有可能组合都想清楚,然后生成相应的子类,随着咖啡口味的增多,以及添加顺序的改变,几乎是不可扩展和维护的。
原味咖啡是本质,而加奶,加糖都是在装饰这个本质的东西,再怎么加东西咖啡还是咖啡。
首先我们有一个
ICoffee
接口,里面有一个制作咖啡的接口方法makeCoffee()
。要进行装饰的类OriginalCoffee
和装饰者基类CoffeeDecorator
(一般为抽象类)实现了此接口。CoffeeDecorator
类里面持有一个ICoffee
引用,我们第一步会把要装饰那个原始对象赋值给这个引用,那样在装饰者类中才可以调用到那个被装饰的对象的方法。MilkDecorator
和SugarDecorator
都继承至CoffeeDecorator
, 都是具体的装饰者类。
- 需要在运行时动态的给一个对象增加额外的职责时候
- 需要给一个现有的类增加职责,但是又不想通过继承的方式来实现的时候(应该优先使用组合而非继承),或者通过继承的方式不现实的时候(可能由于排列组合产生类爆炸的问题)。
参考:
https://zhuanlan.zhihu.com/p/64584677