設計模式-裝飾器模式

Head First 設計模式(中文版) 讀書筆記

先說下裝飾器模式要解決的問題:能夠使咱們在不修改任何底層代碼的狀況下,給你的對象賦予新的職責,也就是在不改變原有對象的前提下增長行爲,知足開閉原則java

開閉原則:對擴展開放,對修改關閉!

定義:git

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

00原則:github

1. 封裝變化
2. 多用組合,少用繼承
3. 針對接口變成,不針對實現編程
4. 爲交互對象直接的鬆耦合
5. 對擴張開放,對修改關閉

優勢:編程

1. 動態的
2. 提供了有別於繼承的另外一種選擇
3. 符合開閉原則
4. 能夠搭配其餘模式,如工廠模式和生成器模式等

缺點:設計模式

1. 裝飾器模式,經常形成設計中有大量的小類

類圖:
裝飾器類圖ide

舉例描述:學習

裝飾器就相似於一個一個的包裝器,將被裝飾對象包裝起來,開局就是一個猴,只不過是從石頭縫蹦出來的,在後去蓬萊仙島學習仙術,學習到了72般變化和精鬥雲稱爲孫行者,以後闖龍宮,鬧天空,吃仙丹稱爲了齊天大聖......,每個角色都是對上一個角色的裝飾,最原始的對象就是個可愛的小猴,稱爲被裝飾對象。

image.png

主要實現代碼:this

/**
 * 頂級抽象類
 * @author slxsm
 * @date 2020-05-11
 */
public abstract class Beverage {

    String description = "Unknown Beverage";

    public String getDescription(){
        return description;
    }

    public abstract double cost();
}
/**
 *裝飾者類->調料
 * @author slxsm
 * @date 2020-05-11
 */
public abstract class CondimentDecorator extends Beverage{

    public abstract String getDescription();
}
/**
 *被裝飾類->濃縮咖啡
 * @author slxsm
 * @date 2020-05-11
 */
public class Espresso extends Beverage {

    public Espresso(){
        description = "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}
/**
 * 調料->摩卡
 * @author slxsm
 * @date 2020-05-12
 */
public class Mocha  extends CondimentDecorator{

    Beverage beverage;

    public Mocha(Beverage beverage){
        this.beverage = beverage;
    }

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

    @Override
    public double cost() {
        return .20 + beverage.cost();
    }
}
/**
 * 調料
 * @author slxsm
 * @date 2020-05-12
 */
public class Whip extends CondimentDecorator {

    Beverage beverage;

    public Whip(Beverage beverage){
        this.beverage = beverage;
    }

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

    @Override
    public double cost() {
        return .02 + beverage.cost();
    }
}
/**
 * 客戶端
 * @author slxsm
 * @date 2020-05-12
 */
public class StarbuzzCoffee {

    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        Beverage beverage1 = new DarkRoast();
        beverage1 = new Mocha(beverage1);
        beverage1 = new Mocha(beverage1);
        beverage1 = new Whip(beverage1);
        System.out.println(beverage1.getDescription() + " $" + beverage1.cost());

    }
}
//運行結果
Espresso $1.99
DarkRoast, Mocha, Mocha, whip $1.3

書中指出jdk~inputStream類使用了裝飾器模式,類關係以下:
image.pngspa

示例代碼地址:裝飾器模式Github地址設計

相關文章
相關標籤/搜索