装饰者模式:
- 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了 开闭原则(ocp)
例题:咖啡订单处理
Drink类
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();
}
Dector 类
public class Dector extends Drink {
private Drink obj;
public Dector(Drink obj) {
this.obj = obj;
}
@Override
public float cost() {
return super.getPrice() + obj.cost();
}
}
Dector 子类
public class D1 extends Dector {
public D1(Drink obj) {
super(obj);
setDes("D1);
setPrice(1.0f);
// TODO Auto-generated constructor stub
}
}
public class D2 extends Dector{
public D2(Drink obj) {
super(obj);
setDes("D2");
setPrice(6.0f);
// TODO Auto-generated constructor stub
}
}
Coffee类
public class Coffee extends Drink{
@Override
public float cost() {
// TODO Auto-generated method stub
return super.getPrice();
}
}
Coffee类型一
public class Co1 extends Coffee {
public Co1() {
setDes("类型一咖啡");
setPrice(3.0f);
}
}
Coffee类型二
public class Co2 extends Coffee {
public Co1() {
setDes("类型二咖啡");
setPrice(5.0f);
}
}
Client客户端
public class Client {
public static void main(String[] args) {
Drink order = new Co1();
System.out.println(order.getDes()+"价格为"+order.cost());
order = new Milk(order);
System.out.println(order.getDes()+"价格为"+order.cost());
Drink order1 = new Co2();
float price = order.cost() + order1.cost();
System.out.println(order1.getDes()+"的价格"+order1.cost()+" "+price);
}
}
分析:
Drink 是一个抽象类,表示饮料
Des 就是对咖啡信息的简单描述
cost() 就是计算费用