装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更 有弹性,装饰者模式也体现了开闭原则(ocp) 这里提到的动态的将新功能附加到对象和ocp原则。
1.类图
2.代码
public abstract class Drink {
public String desc;//描述
public float price=0.0f;//价格
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
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();
}
}
public class LongBlack extends Coffee{
public LongBlack(){
setDesc("LongBlack");
setPrice(5.0f);
}
}
public class ShortBlack extends Coffee{
public ShortBlack() {
setDesc("ShortBlack");
setPrice(4.0f);
}
}
装饰者:
public class Decorator extends Drink{
private Drink obj;
@Override
public float cost() {
//getPrice 自己价格+传入装饰对象价格
return super.getPrice()+obj.cost();
}
public Decorator(Drink obj) {//组合
this.obj = obj;
}
@Override
public String getDesc() {
//被装饰者信息
return super.desc+" "+super.getPrice()+"&&"+obj.getDesc();
}
}
public class Chocolate extends Decorator{
public Chocolate(Drink obj) {
super(obj);
setDesc("巧克力");
setPrice(3.0f);
}
}
public class Milk extends Decorator{
public Milk(Drink obj) {
super(obj);
setDesc("牛奶");
setPrice(2.0f);
}
}
public static void main(String[] args) {
//1.点一份LongBlack
LongBlack longBlack = new LongBlack();
System.out.println("单品1:");
System.out.println(longBlack.getDesc());
System.out.println("价格:"+longBlack.cost());
Milk milk = new Milk(longBlack);
System.out.println("加入牛奶后:");
System.out.println(milk.getDesc());
System.out.println("价格:"+milk.cost());
Chocolate chocolate = new Chocolate(milk);
System.out.println("加入牛奶 巧克力后:");
System.out.println(chocolate.getDesc());
System.out.println("价格:"+chocolate.cost());
}
单品1:
LongBlack
价格:5.0
加入牛奶后:
牛奶 2.0&&LongBlack
价格:7.0
加入牛奶 巧克力后:
巧克力 3.0&&牛奶 2.0&&LongBlack
价格:10.0
应用实例: