一、案例

image.png

二、装饰者模式定义

image.png

三、星巴克咖啡设计方案

image.png
image.png

四、代码

单品咖啡抽象类

  1. @Data
  2. public abstract class Drink {
  3. public String des; // 描述
  4. private float price = 0.0f;
  5. //计算费用的抽象方法
  6. //交给子类来实现
  7. public abstract float cost();
  8. }

咖啡

  1. public class Coffee extends Drink {
  2. @Override
  3. public float cost() {
  4. // TODO Auto-generated method stub
  5. return super.getPrice();
  6. }
  7. }

单品咖啡子类

  1. public class Espresso extends Coffee {
  2. public Espresso() {
  3. setDes(" 意大利咖啡 ");
  4. setPrice(6.0f);
  5. }
  6. }
  1. public class LongBlack extends Coffee {
  2. public LongBlack() {
  3. setDes(" longblack ");
  4. setPrice(5.0f);
  5. }
  6. }
  1. public class DeCaf extends Coffee {
  2. public DeCaf() {
  3. setDes(" 无因咖啡 ");
  4. setPrice(1.0f);
  5. }
  6. }

装饰者类

  1. public class Decorator extends Drink {
  2. private Drink obj;
  3. public Decorator(Drink obj) { //组合
  4. // TODO Auto-generated constructor stub
  5. this.obj = obj;
  6. }
  7. @Override
  8. public float cost() {
  9. // TODO Auto-generated method stub
  10. // getPrice 自己价格
  11. return super.getPrice() + obj.cost();
  12. }
  13. @Override
  14. public String getDes() {
  15. // TODO Auto-generated method stub
  16. // obj.getDes() 输出被装饰者的信息
  17. return des + " " + getPrice() + " && " + obj.getDes();
  18. }
  19. }

具体的Decorator

  1. //具体的Decorator, 这里就是调味品
  2. public class Chocolate extends Decorator {
  3. public Chocolate(Drink obj) {
  4. super(obj);
  5. setDes(" 巧克力 ");
  6. setPrice(3.0f); // 调味品 的价格
  7. }
  8. }
  1. public class Milk extends Decorator {
  2. public Milk(Drink obj) {
  3. super(obj);
  4. // TODO Auto-generated constructor stub
  5. setDes(" 牛奶 ");
  6. setPrice(2.0f);
  7. }
  8. }

下单

  1. public class CoffeeBar {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. // 装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack
  5. // 1. 点一份 LongBlack
  6. Drink order = new LongBlack();
  7. System.out.println("费用1=" + order.cost());
  8. System.out.println("描述=" + order.getDes());
  9. // 2. order 加入一份牛奶
  10. order = new Milk(order);
  11. System.out.println("order 加入一份牛奶 费用 =" + order.cost());
  12. System.out.println("order 加入一份牛奶 描述 = " + order.getDes());
  13. // 3. order 加入一份巧克力
  14. order = new Chocolate(order);
  15. System.out.println("order 加入一份牛奶 加入一份巧克力 费用 =" + order.cost());
  16. System.out.println("order 加入一份牛奶 加入一份巧克力 描述 = " + order.getDes());
  17. // 3. order 加入一份巧克力
  18. order = new Chocolate(order);
  19. System.out.println("order 加入一份牛奶 加入2份巧克力 费用 =" + order.cost());
  20. System.out.println("order 加入一份牛奶 加入2份巧克力 描述 = " + order.getDes());
  21. System.out.println("===========================");
  22. Drink order2 = new DeCaf();
  23. System.out.println("order2 无因咖啡 费用 =" + order2.cost());
  24. System.out.println("order2 无因咖啡 描述 = " + order2.getDes());
  25. order2 = new Milk(order2);
  26. System.out.println("order2 无因咖啡 加入一份牛奶 费用 =" + order2.cost());
  27. System.out.println("order2 无因咖啡 加入一份牛奶 描述 = " + order2.getDes());
  28. }
  29. }