1. 程式人生 > >3、裝飾者模式

3、裝飾者模式

讓我 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、裝飾者模式