瀏覽代碼

0719 装饰器模式优化

Qing 10 月之前
父節點
當前提交
0d6c79bcfe

+ 13 - 4
springboot-demo/src/main/java/com/sf/javase/io/pattern/CofferBar.java

@@ -2,6 +2,7 @@ package com.sf.javase.io.pattern;
 
 import com.sf.javase.io.pattern.decorator.Chocolate;
 import com.sf.javase.io.pattern.decorator.Decorator;
+import com.sf.javase.io.pattern.decorator.Soy;
 import com.sf.javase.io.pattern.decorator.Sugar;
 import com.sf.javase.io.pattern.drink.Coffee;
 import com.sf.javase.io.pattern.drink.Drink;
@@ -12,20 +13,28 @@ public class CofferBar {
 
     public static void main(String[] args) {
         // 售卖咖啡时 生成了一笔订单 订单中包含饮品+小料
-        Drink coffee = new Coffee();
+        // 单独售卖咖啡
+        Drink coffee = new Coffee("摩卡",12);
         System.out.println(coffee.getDescription());
         System.out.println(coffee.cost());
 
+        System.out.println("=========");
         // 加了小料的咖啡
         Decorator chocolateCoffee = new Chocolate(coffee);
         System.out.println(chocolateCoffee.getDescription());
         System.out.println(chocolateCoffee.cost());
 
         System.out.println("=========");
-
-        Drink milk = new Milk();
+        Drink milk = new Milk("这是贵的牛奶",15);
         Decorator sugarMilk = new Sugar(milk);
         System.out.println(sugarMilk.getDescription());
-        System.out.println(sugarMilk.cost());;
+        System.out.println(sugarMilk.cost());
+
+        System.out.println("=========");
+        // 加了咖啡豆的咖啡
+        Drink blackCoffee = new Coffee("黑咖啡",14);
+        Decorator decorator = new Soy(blackCoffee);
+        System.out.println(decorator.getDescription());
+        System.out.println(decorator.cost());
     }
 }

+ 1 - 3
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Chocolate.java

@@ -6,8 +6,6 @@ import com.sf.javase.io.pattern.drink.Drink;
 public class Chocolate extends Decorator {
 
     public Chocolate(Drink drink) {
-        super(drink);
-        super.setDescription("加巧克力");
-        super.setPrice(1);
+        super(drink,"加巧克力",1);
     }
 }

+ 7 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Decorator.java

@@ -18,6 +18,13 @@ public class Decorator extends Drink {
         this.drink = drink;
     }
 
+    public Decorator(Drink drink, String description, double price) {
+        super(description, price);
+//        super.setDescription(description);
+//        super.setPrice(price);
+        this.drink = drink;
+    }
+
     @Override
     public double cost() {
         // 用小料的价格 加上饮品的实际价格

+ 3 - 3
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Soy.java

@@ -6,8 +6,8 @@ import com.sf.javase.io.pattern.drink.Drink;
 public class Soy extends Decorator {
 
     public Soy(Drink drink) {
-        super(drink);
-        super.setDescription("加咖啡豆");
-        super.setPrice(0.5);
+        super(drink, "加咖啡豆", 0.5);
+//        super.setDescription("加咖啡豆");
+//        super.setPrice(0.5);
     }
 }

+ 3 - 3
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Sugar.java

@@ -6,8 +6,8 @@ import com.sf.javase.io.pattern.drink.Drink;
 public class Sugar extends Decorator {
 
     public Sugar(Drink drink) {
-        super(drink);
-        super.setPrice(0.1);
-        super.setDescription("加糖");
+        super(drink,"加糖",0.1);
+//        super.setPrice(0.1);
+//        super.setDescription("加糖");
     }
 }

+ 8 - 2
springboot-demo/src/main/java/com/sf/javase/io/pattern/drink/Coffee.java

@@ -3,9 +3,15 @@ package com.sf.javase.io.pattern.drink;
 // 咖啡
 public class Coffee extends Drink {
 
+    // 子类要调用父类的构造器
     public Coffee() {
-        super.setDescription("这是没打折的咖啡");
-        super.setPrice(10);
+        // 此时的super 指代父类构造器
+        // 这里给出默认参数
+        super("这是没打折的咖啡",10);
+    }
+
+    public Coffee(String description, double price) {
+        super(description, price);
     }
 
     @Override

+ 10 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/drink/Drink.java

@@ -6,6 +6,16 @@ import lombok.Data;
 @Data
 public abstract class Drink {
 
+    public Drink() {
+    }
+
+    // 当子类创建对象时 需要设置父类的属性
+    // 可以通过父类提供一个有参数的构造器
+    public Drink(String description, double price) {
+        this.description = description;
+        this.price = price;
+    }
+
     // 描述
     private String description;
     // 价格

+ 5 - 2
springboot-demo/src/main/java/com/sf/javase/io/pattern/drink/Milk.java

@@ -4,8 +4,11 @@ package com.sf.javase.io.pattern.drink;
 public class Milk extends Drink {
 
     public Milk() {
-        super.setDescription("这是打了八折的牛奶");
-        super.setPrice(8);
+        super("这是打了八折的牛奶", 8);
+    }
+
+    public Milk(String description, double price) {
+        super(description, price);
     }
 
     @Override