目录
一.装饰者模式介绍
装饰者模式又称为包装模式,它主要是为了扩展对象的功能,通过持有对象的引用,把对象包装起来,可以在调用对象的方法之前或者之后增加新的功能,以达到给对象添加一些额外的职责,就像为对象添加了一些装饰。
另一个要点是,包装者可以有很多个,对象被包装了一层之后,依然可以继续再包装来添加新的职责。添加职责的目的其实就是为了扩展对象的功能,通过使用装饰者模式可以使得系统具有非常好的弹性。遵循了面向对象原则:对扩展开放,对修改关闭。如果有新的需求变更,对象功能扩展,只需要新增一个装饰者类,将对象包装起来即可扩展对象的功能,而不需要对旧有对象代码进行修改。
通过继承,子类进行方法重写同样也可以扩展对象的功能。但它的弹性比较差,一旦业务变更或新增业务功能时,就需要打开实现类的代码进行修改,这样不仅需要检查旧有代码,同时还要保证新增代码的正确性。类的继承关系是在编译期就已经确定好了,运行期间不能动态的更改,使用装饰者模式可以在运行期间动态的、不限量的给对象添加装饰者,扩展功能。装饰者模式是替代继承来扩展对象功能更好的方案。
二.术语
ConcreteCompent:
是需要扩展功能的对象或者叫组件对象。
Decorator:
是装饰者类共同实现的接口或抽象类,它和ContreateCompent具有相同的超类型,并且持有一个待扩展对象的引用。
ConcreteDecorator:
A等是具体的装饰者类,它们可以给引用的组件对象加上新的方法。新的方法通过在旧的方法的前面或者后面做一些计算来添加。
注意:concreteComponent、Decorator都会实现或继承Component
三.角色
- Client 类:装饰模式的调用者
- **Component**:主体===》饮料(Drink)
- **concreteComponent**:被装饰者===》咖啡(Coffee)
- xxxConcreteComponent:具体的被装饰者(ChinaCoffee)
美式咖啡、欧式咖啡、中式咖啡
- **Decorator**:装饰器===》调料
- xxxDecorator:子装饰器
糖类、奶酪、牛油、芥末
四. 案例
单体咖啡与调味组合的饮料计价项目
这个项目最容易想到的设计方案就是采用继承的设计方案,设计思路如下:
Drink===》饮品
Juice===》果汁
.......
Coffee===》咖啡
ChinaCoffee===》中式咖啡
ASeasoningChinaCoffee===》被A调料修饰的中式咖啡
BSeasoningChinaCoffee===》被B调料修饰的中式咖啡
......
XxxCoffee===》其它咖啡
ASeasoningXxxCoffee===》被A调料修饰的其它咖啡
BSeasoningXxxCoffee===》被B调料修饰的其它咖啡
......
上面每个类中都有getPrice计价的功能,从结果上来看ÿ