Head First 設計模式(中文版) 讀書筆記
先說下裝飾器模式要解決的問題:能夠使咱們在不修改任何底層代碼的狀況下,給你的對象賦予新的職責,也就是在不改變原有對象的前提下增長行爲
,知足開閉原則
,java
開閉原則:對擴展開放,對修改關閉!
定義:git
裝飾器模式是動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
00原則:github
1. 封裝變化 2. 多用組合,少用繼承 3. 針對接口變成,不針對實現編程 4. 爲交互對象直接的鬆耦合 5. 對擴張開放,對修改關閉
優勢:編程
1. 動態的 2. 提供了有別於繼承的另外一種選擇 3. 符合開閉原則 4. 能夠搭配其餘模式,如工廠模式和生成器模式等
缺點:設計模式
1. 裝飾器模式,經常形成設計中有大量的小類
類圖:
ide
舉例描述:學習
裝飾器就相似於一個一個的包裝器,將被裝飾對象包裝起來,開局就是一個猴,只不過是從石頭縫蹦出來的,在後去蓬萊仙島學習仙術,學習到了72般變化和精鬥雲稱爲孫行者,以後闖龍宮,鬧天空,吃仙丹稱爲了齊天大聖......,每個角色都是對上一個角色的裝飾,最原始的對象就是個可愛的小猴,稱爲被裝飾對象。
主要實現代碼: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
類使用了裝飾器模式,類關係以下:
spa
示例代碼地址:裝飾器模式Github地址設計