3、裝飾者模式
阿新 • • 發佈:2018-10-07
讓我 family code 選擇 4.2 ali 包裝 new mil 裝飾者定義:動態的將責任附加到對象上,想要擴展功能,裝飾者提供有別於繼承的另一種選擇。
- 解決繼承濫用的問題,使用組合的方式在運行時裝飾類;
- 對擴展開放,對修改關閉;
- 繼承屬於擴展形式之一,但是也可以使用委托的方式實現擴展;
- 在設計當中,應該允許行為可以被擴展,而無須修改現有的代碼;
- 組合與委托可以用於在運行時動態的增加新的行為;
- 除了繼承,裝飾者模式也可以讓我們擴展行為;
- 裝飾者模式意味著一群裝飾者類,這些類用來包裝具體組件;
- 裝飾者與被裝飾者具有相同的類型,例如EspressoBeverage類與MilkBeverage類都是繼了Beverage抽象類;
- 裝飾者可以在被裝飾者的行為前面或者後面加上自己的行為,例如MilkBeverage 中增加了描述與價格;
- 可以使用無數個裝飾者包裝一個組件;
- 裝飾者會導致設計中出現大量的小對象,過度使用會讓程序變得復雜;
public abstract class Beverage { public String describe = "沒有描述信息!"; public String getDescribe() { return describe; } public abstract double getCost(); }定義濃咖啡飲料裝飾者:
public class EspressoBeverage extends Beverage {定義摩卡飲料裝飾者:public EspressoBeverage(String describe) { this.describe = describe; } @Override public double getCost() { return 1.9; } }
public class MochaBeverage extends Beverage { private Beverage beverage; public MochaBeverage(Beverage beverage) {定義牛奶飲料裝飾者:this.beverage = beverage; } @Override public String getDescribe() { return beverage.getDescribe() + ",摩卡"; } @Override public double getCost() { return beverage.getCost() + 2.0; } }
public class MilkBeverage extends Beverage { private Beverage beverage; public MilkBeverage(Beverage beverage) { this.beverage = beverage; } @Override public String getDescribe() { return beverage.getDescribe() + ",加奶"; } @Override public double getCost() { return beverage.getCost() + 0.3; } }
public class Test { public static void main(String[] args) { Beverage espressoBeverage = new EspressoBeverage("正常咖啡"); Beverage mochaBeverage = new MochaBeverage(espressoBeverage); Beverage milkBeverage = new MilkBeverage(mochaBeverage); System.out.println(mochaBeverage.getDescribe()); System.out.println(mochaBeverage.getCost()); System.out.println(milkBeverage.getDescribe()); System.out.println(milkBeverage.getCost()); } } 執行結果: 正常咖啡,摩卡 3.9 正常咖啡,摩卡,加奶 4.2
3、裝飾者模式