装饰者设计模式:
可以解决类爆炸的问题和cop原则
比如如果是一个卖咖啡的商店,去卖不同种类的咖啡,有黑咖啡,意大利咖啡,还可以加入很多调理的话.
如果用传统的面向对象的方法的话会使得类爆炸。
如果引用装饰者模式可以动态的增加方法。使得类自动建造
原来的方案
这里有装饰者和被装饰者。以前我们都是咖啡上加入调理,现在我们是调理中加入咖啡
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());
}
}
输出结果:
动态添加价格以及描述信息
在JDK中的IO流中应用到装饰者模式。