设计模式之装饰者模式
-
简单例子说明装饰者模式
-
星巴克咖啡订单项目(咖啡管)
-
咖啡种类:Espresso(意大利浓咖啡)、shortBlack、LongBlack、Decaf
-
调料:Milk、Chicilate、Soy(豆浆)
-
要求在扩展新的咖啡时,具有良好的延展性、改动方便、维护方便
-
使用OO来计算不同种类咖啡的费用:用户可以点单品咖啡,也可以单品+调料组合
-
-
实施方案
-
方案一(不推荐)
-
类图
-
分析
-
Drink是一个抽象类,表示饮料
-
des就是对咖啡的描述,比如咖啡封顶名字,价格等等
-
cost()就是计算费用,在Drink是一个抽象方法
-
单品咖啡继承了Drink
-
Espress && Milk就是单品咖啡+调料。这种组合很多
-
-
缺点:
-
这样设计时,当我们增加一个新非咖啡种类或者调料时,类的数量机会倍增,就会出现类爆炸
-
-
-
方案二(比方案一好一些)
-
上面在方案一分析出,如果使用方案一会发生类爆炸,因此方案二进行了改进,将调料内置到Drink,这样就不会造成类的数量过多,从而提高项目的维护性
-
类图
-
分析
-
方案二可以控制类的数量,不至于造成很多的类
-
在增加或者删除调料种类时,代码的维护量还是很大
-
考虑到用户可以添加多份调料时,可以将hasXXX()返回一个int
-
考虑使用装饰者模模式
-
-
-
-
-
通过装饰者模式解决上面两种解决方案的不足、
-
装饰者模式定义
-
装饰者模式:动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则
-
这里提到的动态的将新功能附加到对象和ocp原则,在代码会会得以体现
-
-
装饰者模式原理
-
说明
-
实现图
-
代码实现
//注意分包
//编写Drink,这是一个比较重要的类
public abstract class Drink{
public String des;//对Drink的描述
private float price = 0.0f;
//增加get和set方法
//计算 费用的抽象方法
public abstract float cost();
}
//编写coffee类
public class Coffee extends Drink{
-
-