java设计模式-装饰者模式
装饰者模式定义
- 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)’
- 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现.
星巴克咖啡订单项目(咖啡馆〉:
1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式
咖啡)、Decaf(无因咖啡)
2)调料:Milk、Soy(豆浆)、Chocolate
3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
4)使用OO的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖
啡+调料组合。
这种方式 每一种配料和 咖啡组合 都会增加一个类 这样类会很多会类爆炸
所以使用装饰者模式解决
总接口
//总接口
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 Coffeee extends Drink{
@Override
public float cost() {
return super.getPrice();
}
}
具体的意大利咖啡
//具体的意大利咖啡
public class Espresso extends Coffeee{
public Espresso(){
setDes("意大利咖啡");
setPrice(6.0f);
}
}
装饰者接口
//装饰者
public class Decorator extends Drink{
//将咖啡组合进来
private Drink obj;
public Decorator(Drink obj){
this.obj=obj;
}
@Override
public float cost() {
//配料的价格加上+饮料的价格
return super.getPrice()+ obj.cost();
}
public String getDes(){
//obj.getDes()输出被装饰者的信息
//super.getDes()输出配料的信息
return super.getDes()+""+obj.getDes();
}
}
具体的装饰者 继承了调味品 接口拥有调味品所有方法
//具体的Decorator,这里就是具体的调味品
public class Milk extends Decorator{
public Milk(Drink obj) {
super(obj);
setDes("牛奶");
setPrice(2.0f);//调味品的价格
}
}
//具体的Decorator,这里就是具体的调味品
public class Chocolate extends Decorator{
public Chocolate(Drink obj) {
super(obj);
setDes("巧克力");
setPrice(3.0f);//调味品的价格
}
}
测试
public static void main(String[] args) {
//1.点一份LogBlack 加一分牛奶 和一个巧克力
Drink LogBlack=new LongBlack();
System.out.println("价格"+LogBlack.cost()+"描述"+LogBlack.getDes());
//咖啡套一层牛奶
LogBlack=new Milk(LogBlack);
System.out.println("价格"+LogBlack.cost()+"描述"+LogBlack.getDes());
//咖啡+牛奶 在外面套一层巧克力
LogBlack = new Chocolate(LogBlack);
System.out.println("价格"+LogBlack.cost()+"描述"+LogBlack.getDes());
}
结果
IO流中使用到了 装饰者模式