装饰者设计模式:
可以解决类爆炸的问题和cop原则
比如如果是一个卖咖啡的商店,去卖不同种类的咖啡,有黑咖啡,意大利咖啡,还可以加入很多调理的话.
如果用传统的面向对象的方法的话会使得类爆炸。
如果引用装饰者模式可以动态的增加方法。使得类自动建造
原来的方案
装饰者模式_设计模式_java_构造函数

这里有装饰者和被装饰者。以前我们都是咖啡上加入调理,现在我们是调理中加入咖啡

装饰者模式_设计模式_java_自动生成_02
装饰者模式_设计模式_java_构造函数_03
Drink.java

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();
}

Coffee.java

public class Coffee extends Drink{

@Override
public float cost() {
// TODO 自动生成的方法存根
return super.getPrice();
}

}

ECoffee.java

public class ECoffee extends Coffee{
public ECoffee() {
setDes("意大利咖啡");
setPrice(4.0f);
}

}

BlackCoffee.java

public class BlackCoffee extends Coffee{
public BlackCoffee() {
setDes("黑咖啡");
setPrice(5.0f);

}

}

装饰者:
Decorator.java

public class Decorator extends Drink{
private Drink obj;
public Decorator(Drink obj) {
//组合
this.obj = obj;
// TODO 自动生成的构造函数存根
}
@Override
public float cost() {
// TODO 自动生成的方法存根

return super.getPrice()+obj.cost();
}
@Override
public String getDes() {
// TODO 自动生成的方法存根
return super.des + " " + super.getPrice()+ " " + obj.getDes();
}

}

调理:巧克力

public class Chocolate extends Decorator{

public Chocolate(Drink obj) {
super(obj);
setDes("巧克力");
setPrice(1.0f);
// TODO 自动生成的构造函数存根
}

}

调理:牛奶

public class Milk extends Decorator{

public Milk(Drink obj) {


super(obj);
setDes("牛奶");
setPrice(2.0f);
// TODO 自动生成的构造函数存根
}

}

咖啡店:

public class CoffeeBar {
public static void main(String[] args) {
Drink drink1 = new BlackCoffee();
System.out.println(drink1.cost());
System.out.println(drink1.getDes());
drink1 = new Milk(drink1);
System.out.println(drink1.cost());
System.out.println(drink1.getDes());
}

}

输出结果:
装饰者模式_设计模式_java_java_04
动态添加价格以及描述信息

在JDK中的IO流中应用到装饰者模式。