设计模式 |
您所在的位置:网站首页 › 星巴克企业形象设计方案ppt › 设计模式 |
装饰器模式
简述问题背景解决方案1:传统方案解决方案2:解决类爆炸解决方案3:装饰者模式装饰者模式原理装饰者模式解决星巴克咖啡订单问题
代码示例:源码
简述
装饰者模式的定义为:动态的给一个对象添加其它功能。 从扩展性来说,这种方式比继承更有弹性,更加灵活,装饰者模式也体现了开闭原则(OCP)。 问题背景星巴克咖啡订单项目(咖啡馆) : 1)咖啡种类/单品咖啡: Espresso(意大利浓咖啡)、ShortBlack、Decaf(无因咖啡)、LongBlack(美式咖啡) 2)配料: Milk、Soy(豆浆)、Chocolate 3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 4)使用OO的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。 解决方案1:传统方案
最普通的设计就是有多少种组合那就写多少种类,这样排列组合下来类的数量会成倍增加,就会出啊先类爆炸。 解决方案2:解决类爆炸
我们来解释一下: 1)Drink就是所有饮品的超类,就是前面所说的Component 2)Coffee是我们单品咖啡的父类 3)Decorator就是配料类的超类,配料就是装饰者。 4)如果我们点了单品咖啡,然后有加了配料,那么我们可以将这个单品咖啡类放到装饰类的Drink属性上,因为都继承了Drink,所以被装饰了的类也是Drink对象,所以如果我们再加配料,仍然可以将这个对象放到新的装饰者(配料)对象中的Drink属性上。 Drink类 public abstract class Drink { private String desc; private Double price = 0.00; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public abstract Double cost(); }配料超类(装饰者类) public class Decorator extends Drink{ private Drink obj; public Decorator(Drink obj) { this.obj = obj; } @Override public Double cost() { return super.getPrice() + obj.cost(); } @Override public String getDesc() { return super.getDesc() + " " + super.getPrice() + " " + obj.getDesc(); } }Coffee类 public class Coffee extends Drink{ @Override public Double cost() { // 对于单体咖啡就是价格 return super.getPrice(); } }单体咖啡类 public class Espresso extends Coffee{ public Espresso() { setDesc("Espresso"); setPrice(3.00); } } public class LongBlack extends Coffee{ public LongBlack() { setDesc("ShortBlack"); setPrice(5.00); } } public class ShortBlack extends Coffee{ public ShortBlack() { setDesc("ShortBlack"); setPrice(4.00); } }配料类 public class Chocolate extends Decorator{ public Chocolate(Drink obj) { super(obj); setDesc("Chocolate"); setPrice(1.00); } } public class Milk extends Decorator{ public Milk(Drink obj) { super(obj); setDesc("Milk"); setPrice(1.10); } } public class Soy extends Decorator{ public Soy(Drink obj) { super(obj); setDesc("Soy"); setPrice(1.20); } }咖啡店类 public class CoffeeBar { public static void main(String[] args) { // 装饰者模式下订单:2份Chocolate + 1份Mikl的LongBlack // 1.点一份LongBlack Drink order = new LongBlack(); System.out.println("单体咖啡" + order.getDesc() + "的费用:" + order.cost()); // 2.加入一份Mikl order = new Milk(order); System.out.println("单体咖啡" + order.getDesc() + "的费用:" + order.cost()); // 3.加入两份巧克力 order = new Chocolate(order); order = new Chocolate(order); System.out.println("单体咖啡" + order.getDesc() + "的费用:" + order.cost()); } } 源码GitHub地址:design-patterns |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |