1. 定義:動態的將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。 2. 類結構圖: 3. 代碼實現 // // 以下是測試類 ...
1. 定義:動態的將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
2. 類結構圖:
3. 代碼實現
1 package com.dcz.decorate; 2 3 /** 4 * 飲料 抽象類 5 * @author Administrator 6 */ 7 8 public abstract class Beverage { 9 10 // 描述 11 String description = "Unknown Beverage"; 12 13 // 獲取飲料描述 14 public String getDescription(){ 15 return this.description; 16 } 17 18 // 計算價格方法 19 public abstract double cost(); 20 21 }
1 package com.dcz.decorate; 2 3 /** 4 * 綜合 - 咖啡 5 * @author Administrator 6 * 7 */ 8 9 public class HouseBlend extends Beverage { 10 11 public HouseBlend(){ 12 description = "House Blend Coffee"; 13 } 14 15 @Override 16 public double cost() { 17 return 0.89; 18 } 19 20 }
1 package com.dcz.decorate; 2 3 /** 4 * 深陪 - 咖啡 5 * @author Administrator 6 * 7 */ 8 9 public class DarkRoast extends Beverage { 10 11 public DarkRoast(){ 12 description = "Dark Roast Coffee"; 13 } 14 15 @Override 16 public double cost() { 17 return 0.99; 18 } 19 20 }
1 package com.dcz.decorate; 2 3 /** 4 * 超濃縮 - 咖啡 5 * @author Administrator 6 */ 7 8 public class Espresso extends Beverage { 9 10 public Espresso(){ 11 description = "Espresso Coffee"; 12 } 13 14 @Override 15 public double cost() { 16 return 1.99; 17 } 18 19 }
1 package com.dcz.decorate; 2 3 /** 4 * 濃縮 - 咖啡 5 * @author Administrator 6 * 7 */ 8 9 public class Decat extends Beverage { 10 11 public Decat(){ 12 description = "Decat Coffee"; 13 } 14 15 @Override 16 public double cost() { 17 return 1.99; 18 } 19 20 }
//-----------------------------------------------------------------------
1 package com.dcz.decorate; 2 3 /** 4 * 調味品 - 裝飾者 5 * @author Administrator 6 * 7 */ 8 9 public abstract class CondimentDecorator extends Beverage { 10 11 // 所有的飲料裝飾著必須重新實現此方法 12 public abstract String getDescription(); 13 14 }
1 package com.dcz.decorate; 2 3 /** 4 * 摩卡- 配料 5 * @author Administrator 6 * 7 */ 8 9 public class Mocha extends CondimentDecorator { 10 11 // 用一個實例變數記錄飲料,也就是被裝飾者 12 Beverage beverage; 13 14 public Mocha(Beverage beverage){ 15 this.beverage = beverage; 16 } 17 18 @Override 19 public String getDescription() { 20 return beverage.getDescription() + ", Mocha"; 21 } 22 23 // 計算摩卡價格 24 public double cost(){ 25 return 0.20 + beverage.cost(); 26 } 27 28 29 }
1 package com.dcz.decorate; 2 3 /** 4 * 豆漿 - 配料 5 * @author Administrator 6 * 7 */ 8 9 public class Soy extends CondimentDecorator { 10 11 // 記錄飲料被裝飾者 12 Beverage beverage; 13 14 public Soy(Beverage beverage){ 15 this.beverage = beverage; 16 } 17 18 @Override 19 public String getDescription() { 20 return beverage.getDescription() + ", Soy"; 21 } 22 23 public double cost(){ 24 return 0.15 + beverage.cost(); 25 } 26 27 }
1 package com.dcz.decorate; 2 3 /** 4 * 奶泡 - 配料 5 * @author Administrator 6 * 7 */ 8 9 public class Whip extends CondimentDecorator { 10 11 Beverage beverage; 12 13 public Whip(Beverage beverage){ 14 this.beverage = beverage; 15 } 16 17 @Override 18 public String getDescription() { 19 return beverage.getDescription() + ", Ship"; 20 } 21 22 // 計算奶泡價格 23 public double cost(){ 24 return 0.10 + beverage.cost(); 25 } 26 27 }
// ----------------------------------------------------------------------------------------以下是測試類
1 package com.dcz.decorate; 2 3 public class TestStrbuzzCoffee { 4 5 public static void main(String[] args) { 6 7 // 要一杯超濃縮咖啡 8 Beverage espresso = new Espresso(); 9 System.out.println(espresso.getDescription() + ", $:" + espresso.cost()); 10 11 // 要一杯深陪咖啡,雙倍摩卡加奶泡 12 Beverage darkRoast = new DarkRoast(); 13 // 使用第一個摩卡裝飾 14 darkRoast = new Mocha(darkRoast); 15 // 使用第二個摩卡裝飾 16 darkRoast = new Mocha(darkRoast); 17 // 使用奶泡裝飾 18 darkRoast = new Whip(darkRoast); 19 System.out.println(darkRoast.getDescription() + ", $:" + darkRoast.cost()); 20 21 // 最後要在一杯調料為豆漿,摩卡,奶泡的綜合咖啡 22 Beverage HouseBlend = new HouseBlend(); 23 // 使用豆漿裝飾 24 HouseBlend = new Soy(HouseBlend); 25 // 使用摩卡裝飾 26 HouseBlend = new Mocha(HouseBlend); 27 // 使用奶泡裝飾 28 HouseBlend = new Whip(HouseBlend); 29 System.out.println(HouseBlend.getDescription() + ", $:" + HouseBlend.cost()); 30 31 } 32 33 }