裝飾者模式

01 定義

裝飾者模式:動態(tài)的將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。

02 情景

現(xiàn)有深焙咖啡(10.0元)和家??Х龋?1.0元),可以添加各種調味:牛奶(1.0元)、摩卡(1.5元)、巧克力(2.0元)等等。不管添加了什么,最后都還是咖啡。

03 類圖

DecoratorPattern.png

04 Class

// 飲料的抽象類
public abstract class Beverage {
    protected String description = "";
    public String getDescription(){
        return description;
    }
    public abstract double cost();
}
// 深焙咖啡
public class DarkRoast extends Beverage {
    public DarkRoast(){
        description = "Dark roast";
    }
    @Override
    public double cost() {
        return 10.0;
    }
}
// 家??Х?public class HouseBlend extends Beverage {
    public HouseBlend(){
        description = "House blend";
    }
    @Override
    public double cost() {
        return 11.0;
    }
}
// 調味品 裝飾者 抽象類
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}
// 牛奶 裝飾者
public class MilkDecorator extends CondimentDecorator {
    private Beverage beverage;
    public MilkDecorator(Beverage beverage){
        this.beverage = beverage;
        description = "Milk";
    }
    @Override
    public String getDescription() {
        return beverage.getDescription() +","+ description;
    }
    @Override
    public double cost() {
        return beverage.cost() + 1.0;
    }
}
// 摩卡 裝飾者
public class MochaDecorator extends CondimentDecorator {
    private Beverage beverage;
    public MochaDecorator(Beverage beverage){
        this.beverage = beverage;
        description = "Mocha";
    }
    @Override
    public String getDescription() {
        return beverage.getDescription() +","+ description;
    }
    @Override
    public double cost() {
        return beverage.cost() + 1.5;
    }
}

05 測試

// 定一杯Dark roast,不加調料。
Beverage beverage01 = new DarkRoast();
System.out.println(beverage01.getDescription() + " $" + beverage01.cost());

// 定一杯Dark roast,加牛奶和摩卡
Beverage beverage02 = new DarkRoast();
beverage02 = new MilkDecorator(beverage02);
beverage02 = new MochaDecorator(beverage02);
System.out.println(beverage02.getDescription() + " $" + beverage02.cost()); 
TestResult.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 定義 裝飾者模式動態(tài)地將責任附加到對象上.若要擴展對象,裝飾者提供了比繼承更有彈性的替代方案. 實現(xiàn)要點 繼承屬于...
    Link913閱讀 403評論 0 0
  • 設計原則: 少用繼承,多用組合 類應該對擴展開放,對修改關閉 目錄 本文的結構如下: 什么是裝飾者模式 為什么要用...
    w1992wishes閱讀 1,292評論 0 7
  • 裝飾者模式可以做到在不修改任何底層代碼的情況下,給對象增加的新的方法。首先,我們通過對一個現(xiàn)實問題的模擬分析,了解...
    六尺帳篷閱讀 1,016評論 0 9
  • 定義 動態(tài)地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。 Attach additio...
    狐尼克朱迪閱讀 281評論 0 0
  • 定義 Decorator Pattern 在不改變接口的情況下,動態(tài)的擴展一個對象的功能。通過包裝對象來實現(xiàn),又稱...
    微微笑的蝸牛閱讀 923評論 0 49

友情鏈接更多精彩內容