本文共 3719 字,大约阅读时间需要 12 分钟。
1.问题引出
星巴克咖啡订单项目(咖啡馆):2.方案1-较差的方案
3.方案2- 解决星巴克咖啡订单( 好点)前面分析到方案1因为 咖啡单品+ 调料组合会造成类的倍增,因此可以做改进,将调料内置到Drink类,这样就不会造成类数量过多。从而提高项目的维护性(如图)
方案2-的问题分析
4.装饰者模式
装饰者模式定义装饰者模式原理
package decorator;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();}
package decorator;public class ShortBlack extends Coffee{ public ShortBlack() { setDes("ShortBlack"); setPrice(4.0f); }}
package decorator;public class Espresso extends Coffee{ public Espresso() { setDes("意大利咖啡"); setPrice(6.0f); }}
package decorator;public class Coffee extends Drink{ @Override public float cost() { return super.getPrice(); }}
package decorator;public class Coffee extends Drink{ @Override public float cost() { return super.getPrice(); }}
package decorator;public class Decorator extends Drink{ private Drink obj; public Decorator(Drink obj) { this.obj = obj; } @Override public float cost() { return super.getPrice() + obj.cost(); } @Override public String getDes() { return super.des + " " + super.getPrice() + " && " + obj.getDes(); }}
package decorator;//具体的Decorator,这里就是调味品public class Chocolate extends Decorator{ public Chocolate(Drink obj) { super(obj); setDes("巧克力"); setPrice(3.0f);//调味品的价格 }}
package decorator;public class Milk extends Decorator{ public Milk(Drink obj) { super(obj); setDes(" 牛奶 "); setPrice(2.0f); }}
package decorator;public class Soy extends Decorator{ public Soy(Drink obj) { super(obj); setDes(" 豆浆 "); setPrice(1.5f); }}
package decorator;public class CoffeeBar { public static void main(String[] args) { //点一份longback Drink order = new LongBlack(); //加入一份牛奶 order = new Milk(order); //加入一份巧克力 order = new Chocolate(order); //加入一份巧克力 order = new Chocolate(order); System.out.println(order.cost()); }}
5.装饰者模式在JDK应用的源码分析
Java的IO结构,FilterInputStream就是一个装饰者转载地址:http://tctzk.baihongyu.com/