head first 設計模式筆記3-裝飾者模式:星巴茲飲料

開放原則:類應該對擴展開放,對修改關閉。ide

  - 上篇博客中的觀察者模式中,經過加入新的觀察者,咱們能夠在任什麼時候候擴展主題(Subject),並且不需向主題中添加代碼。測試

  - 裝飾者模式也徹底遵循開放原則。this

 

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

  記住:是你,還有你,一切拜託你。code

    是你:包裝類繼承(或實現)被包裝類對象

    還有你:包裝類包含被包裝類的一個實例blog

      一切拜託你:非加強方法所有拜託 被包裝類的實例來完成繼承

    加強方法:根據需求重寫方法ip

 

 

 

 代碼get

/**
 * 飲料
 * @author oy
 * @date 2019年8月28日 下午11:07:33
 * @version 1.0.0
 */

public abstract class Beverage {
    public String description;

    public String getDescription() {
        return description;
    }
    
    public abstract double cost();
    
    // 其餘方法
    public abstract String method1();
}

 

  CondimentDecorator

/**
 * 裝飾類 = 飲料 + 調料
 * @author oy
 * @date 2019年8月28日 下午11:13:55
 * @version 1.0.0
 */
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
    
    // 空實現
    public String method1() {
        return "";
    }
}

 

  Espresso

/**
 * 濃縮咖啡
 */
public class Espresso extends Beverage {

    public Espresso() {
        description = "Espresso";
    }
    
    @Override
    public double cost() {
        return 1.0;
    }

    @Override
    public String method1() {
        return "Espresso method1()";
    }
}

 

  HouseBlend

/**
 * House Blend Coffee*/
public class HouseBlend extends Beverage {

    public HouseBlend() {
        description = "House Blend Coffee";
    }
    
    @Override
    public double cost() {
        return 2.0;
        
    }

    @Override
    public String method1() {
        // TODO Auto-generated method stub
        return "HouseBlend method1()";
    }
}

 

  Mocha

/**
 * 具體的裝飾類:是你,還有你,一切拜託你。*/

public class Mocha extends CondimentDecorator {//是你:Mocha是Beverage類型
    
    Beverage beverage; // 還有你:Mocha包含Beverage的對象實例
    
    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }
    
    // 一切拜託你:Beverage的不須要加強的方法所有拜託給beverage對象來處理
    @Override
    public String method1() {
        return beverage.method1();
    }

    // 重寫加強方法
    @Override
    public double cost() {
        return 0.20 + beverage.cost();
    }
}

 

  Whip

/**
 * 具體的裝飾類:是你,還有你,一切拜託你。
 * @author oy
 * @date 2019年9月1日 上午10:06:53
 * @version 1.0.0
 */
public class Whip extends CondimentDecorator {//是你
    
    Beverage beverage; // 還有你
    
    public Whip(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Whip";
    }
    
    @Override
    public String method1() {
        return beverage.method1();
    }

    // 加強方法
    @Override
    public double cost() {
        return 0.30 + beverage.cost();
    }
}

 

  測試代碼

public static void main(String[] args) {
    Beverage beverage = new Espresso();
    System.out.println(beverage.getDescription() + " $" + beverage.cost());
    System.out.println(beverage.method1());
    
    // 用摩卡裝飾Espresso(濃縮飲料)
    Beverage mocha = new Mocha(beverage);
    System.out.println(mocha.getDescription() + " $" + mocha.cost());
    System.out.println(mocha.method1());
    // 還能夠繼續裝飾mocha
    mocha = new Whip(mocha);
    System.out.println(mocha.getDescription() + " $" + mocha.cost());
    System.out.println(mocha.method1());
}

 

  打印結果:

Espresso $1.0
Espresso method1()
Espresso, Mocha $1.2
Espresso method1()
Espresso, Mocha, Whip $1.5
Espresso method1()
相關文章
相關標籤/搜索