目录
1、例子

分析:
1、Drink是一个抽象类,表示饮料
2、des就是对咖啡的描述,比如咖啡的名字
3、cost()方法就是计算费用,Drink类中做成一个抽象方法
4、Decaf就是单品咖啡,继承Drink,并实现cost
5、Espress && Milk 就是单品咖啡+调料 ,这个组合很多
6、问题:这样设计,会有很多类
当我们增加一个单品咖啡,或者一个新的调料类的数量就会倍增,救会出现类爆炸
解决方案2:

分析:
1、方案2可以控制类的数量,不至于造成很多的类
2、在增加或者删除调料种类是,代码的维护量很大
3、考虑到用户可以添加多份调料时,可以将hasMilk返回一个对应int
4、考虑使用装饰者模式
2、基本定义
1、装饰者模式:动态的将新功能、、附加到对象上。在对象功能扩展方面。它比继承更有弹性。装饰者模式也体现了开闭原则(OCP)
2、装饰则模式原理
2.1、装饰者模式就想打包一个快递
主体:陶瓷,衣服(Component)//被装饰者
包装:报纸填充,塑料泡沫,纸板,木板 (Decorator)
2.2、Component
主体:比如类似前面的Drink
2.3、ConcreteComponent和Decorator
ConcreteComponent:具体的主体,比如前面的各个单品咖啡
Decorator:装饰者,比如各调料
2.4、Component与ConcreteComponent之间。如果ConcreteComponent类很多,还可以设计一个缓冲层。将共有的部分提取出来抽象层一个类
解决:
用装饰者模式设计的方案
总结:
由树状图关系 通过装饰者模式。变为贝型可插入式的关系。
是的代码易于维护,解耦。符合开闭原则
贝型:特性 。两个抽象 。通过聚合或者组合关系持有对方。
public class Decorator extends Drink {
private Drink obj;
public Decorator(Drink obj) {//组合
this.obj = obj;
}
@Override
public float cost() {
//getPrice 自己价格
return super.getPrice()+obj.cost();
}
@Override
public String getDes() {
//obj.getDes() 输出被装饰者信息
return super.des+" "+super.getPrice()+"&&"+obj.getDes();
}
}
public abstract class Drink {
public String des;//描述
private float price=0.0f;
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
//计算费用的抽象方法
//子类来实现
public abstract float cost();
}
public class Coffee extends Drink {
@Override
public float cost() {
return super.getPrice();
}
}