Java中的裝飾者模式
阿新 • • 發佈:2019-01-02
裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案
接下來舉一個例子來說明,這個例子是Head Frist 設計模式中的一個例子
場景:在星巴克的咖啡銷售系統中,提供咖啡和調料的組合,並且在使用者選好了咖啡和調料之後自動計算價格
某客戶點了 濃縮咖啡加摩卡加牛奶的組合
首先是飲料類的抽象類
調料類的抽象類package com.zw.mymaven; //飲料的抽象類 public abstract class Beverage { String description = "Unknown Beverage"; //描述 public String getdescribtion() { return description; } //花 費 public abstract double cost(); }
package com.zw.mymaven;
//調料類,也是裝飾者類
public abstract class CondimentDecorrator {
//這裡要重寫getDescribtion的原因
//所謂裝飾者類 其實就是包含被裝飾者的類
//那麼被裝飾者和裝飾者中的共有的還沒定義的方法在這裡定義
public abstract String getDescribtion();
}
濃縮咖啡類
摩卡類package com.zw.mymaven; //濃縮咖啡的飲料類的實現 public class Espresso extends Beverage { public Espresso() { description = "這是一杯濃縮咖啡"; } @Override public double cost() { return 1; } }
package com.zw.mymaven; public class Moka extends CondimentDecorrator { Beverage beverage; public Moka(Beverage beverage) { this.beverage = beverage; } @Override public String getDescribtion() { return beverage.getdescribtion() + "加了摩卡,"; } public double cost() { return beverage.cost() + 2; } }
牛奶類
package com.zw.mymaven;
public class Milk extends CondimentDecorrator {
Beverage beverage;
public Milk(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescribtion() {
return beverage.getdescribtion() + "加了牛奶,";
}
public double cost() {
return beverage.cost() + 3;
}
}
測試類
package com.zw.mymaven;
public class Test3 {
public static void main(String[] args) {
// 點一杯濃縮咖啡
Beverage espresso = new Espresso();
// 加入摩卡
espresso = new Moka(espresso);
// 加入牛奶
espresso = new Milk(espresso);
System.out.println(espresso.getdescribtion() + "花費了" + espresso.cost());
}
}