如何讓孩子愛上設計模式 ——8.裝飾者模式(Decorator Pattern)

標簽: 設計模式初涉


描述性文字

還記得工廠方法模式小豬開的奶茶店嗎?在那一節中講解的是
通過工廠方法模式來做奶茶,做奶茶的工作都已經交給小弟了,
小豬的工作量少了很多,剩下的就是敲起二郎腿坐著收錢了,
于是乎列了一張單子,寫出所有飲品的價格:

奶茶:

  • 原味奶茶:5塊
  • 珍珠奶茶:7塊
  • 椰果奶茶:7塊
  • 珍珠椰果奶茶:9塊

檸檬茶:

  • 原味檸檬茶:3塊
  • 金桔檸檬茶:5塊

然后顧客要什么點什么,按著菜單收費就好了,然而用戶的
需求都是多變的,他們覺得配料那里可以加點紅豆,然后你
的菜單需要新增:

  • 紅豆奶茶:7塊
  • 紅豆珍珠奶茶:9塊
  • 紅豆椰果奶茶:9塊
  • 紅豆珍珠椰果奶茶:11塊

食客又說,還可以加點其他的配料啊,黑鉆,果凍,涼粉,奶蓋,
燒仙草等,然后你的菜單就爆炸了,奶蓋果凍黑鉆燒仙草珍珠椰果奶茶
2333,你仿佛特意在逗我笑,

每個組合都寫一個,這他么得寫多少個,而且用戶總是

天馬行空的,哪天希望配料加點
,也是有可能的,

每多一種配料,就得增加一堆飲品,玩毛。

我們必須想一個更優的套路,這個時候可以考慮引入裝飾者模式
簡單來說就是:一層套一層,比如說要椰果珍珠奶茶:

奶茶 --> 套一層珍珠 --> 珍珠(奶茶) --> 套一層椰果 --> 椰果(珍珠(奶茶))

逼逼那么多,代碼演示下吧!


代碼實現

先定義一個抽象茶的父類,定義茶的名字與定義價格的抽象方法

接著定義配料的抽象類,所有配料都來繼承這個東東

好的,接著定義基本茶品,奶茶和檸檬茶

接著是各種配料,珍珠,椰果,紅豆,金桔,都是繼承配料類

接著開始自由搭配了:

打單:

可以,沒毛病,如果你要奶蓋果凍黑鉆燒仙草珍珠椰果奶茶,也無壓力,
沒新增一個配料就建一個類而已,不用每次都去新建一堆類,然后又
去繼承。


模式要點

定義

動態的給對象添加一些額外的職責,就增加功能來說,裝飾者
模式比起生成子類更加靈活!

四個角色

  • Component抽象組件,可以是接口或抽象類,具體組件與抽象裝飾類
    的共同父類,聲明了在具體組件中實現的業務方法,可以使客戶端以一致的方式
    處理未修飾對象與修飾后的對象,實現了客戶端的透明操作,比如這里的Tea類。
  • ConcreteComponent具體組件,實現抽象組件中生命的方法,裝飾器
    類可以給他增加額外的責任(方法),比如這里的MilkTea和LemonTea。
  • Decorator抽象裝飾類,裝飾組件對象的,內部一定要有一個指向
    組件對象的引用!!!通過該引用可以調用裝飾前構建對象的方法,并通過
    其子類擴展該方法,已達到裝飾的目的,比如這里的Decorator類。
  • ConcreteDecorator具體裝飾類,抽象裝飾類的具體實現,可以調用抽象
    裝飾類中定義的方法,也可以新增新的方法來擴充對象的行為。

UML類圖

適用場景

裝飾者模式是以對客戶端透明的方式擴展對象的功能,是繼承關系的一種替代方案!
以下情況可以考慮是想用對象組合(組合與委托):

  • 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責;
  • 處理那些可以撤消的職責;
  • 當不能采用生成子類的方法進行擴充時:一種情況是,可能有大量獨立的擴展,
    為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況
    可能是因為類定義被隱藏,或類定義不能用于生成子類;

優缺點

  • 擴展對象功能,比繼承靈活,不會導致類個數急劇增加;
  • 可以通過一種動態的方式在運行時選擇不同的具體裝飾類,從而實現不同的行為;
  • 避免了高層次類有太多的特征,可以從一個最簡單的類慢慢給他添加功能;
  • 會產生很多小裝飾者對象,會影響性能,過多使用該模式也會使程序變得復雜。

本節代碼

https://github.com/coder-pig/DesignPatternsExample/tree/master/7.Decorator%20Pattern

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容