如何讓孩子愛(ài)上設(shè)計(jì)模式 ——8.裝飾者模式(Decorator Pattern)

標(biāo)簽: 設(shè)計(jì)模式初涉


描述性文字

還記得工廠方法模式小豬開(kāi)的奶茶店嗎果港?在那一節(jié)中講解的是
通過(guò)工廠方法模式來(lái)做奶茶廉羔,做奶茶的工作都已經(jīng)交給小弟了胀屿,
小豬的工作量少了很多塘揣,剩下的就是敲起二郎腿坐著收錢了,
于是乎列了一張單子宿崭,寫出所有飲品的價(jià)格:

奶茶:

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

檸檬茶:

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

然后顧客要什么點(diǎn)什么亲铡,按著菜單收費(fèi)就好了,然而用戶的
需求都是多變的葡兑,他們覺(jué)得配料那里可以加點(diǎn)紅豆奖蔓,然后你
的菜單需要新增:

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

食客又說(shuō),還可以加點(diǎn)其他的配料啊讹堤,黑鉆吆鹤,果凍,涼粉洲守,奶蓋疑务,
燒仙草等,然后你的菜單就爆炸了梗醇,奶蓋果凍黑鉆燒仙草珍珠椰果奶茶知允,
2333,你仿佛特意在逗我笑叙谨,

每個(gè)組合都寫一個(gè)温鸽,這他么得寫多少個(gè),而且用戶總是

天馬行空的手负,哪天希望配料加點(diǎn)
涤垫,也是有可能的姑尺,

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

我們必須想一個(gè)更優(yōu)的套路,這個(gè)時(shí)候可以考慮引入裝飾者模式吱雏,
簡(jiǎn)單來(lái)說(shuō)就是:一層套一層,比如說(shuō)要椰果珍珠奶茶:

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

逼逼那么多瘾境,代碼演示下吧歧杏!


代碼實(shí)現(xiàn)

先定義一個(gè)抽象茶的父類,定義茶的名字與定義價(jià)格的抽象方法

接著定義配料的抽象類迷守,所有配料都來(lái)繼承這個(gè)東東

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

接著是各種配料兑凿,珍珠凯力,椰果,紅豆礼华,金桔咐鹤,都是繼承配料類

接著開(kāi)始自由搭配了:

打單:

可以,沒(méi)毛病圣絮,如果你要奶蓋果凍黑鉆燒仙草珍珠椰果奶茶祈惶,也無(wú)壓力,
沒(méi)新增一個(gè)配料就建一個(gè)類而已扮匠,不用每次都去新建一堆類捧请,然后又
去繼承。


模式要點(diǎn)

定義

動(dòng)態(tài)的給對(duì)象添加一些額外的職責(zé)棒搜,就增加功能來(lái)說(shuō)疹蛉,裝飾者
模式比起生成子類更加靈活!

四個(gè)角色

  • Component抽象組件力麸,可以是接口或抽象類可款,具體組件與抽象裝飾類
    的共同父類,聲明了在具體組件中實(shí)現(xiàn)的業(yè)務(wù)方法末盔,可以使客戶端以一致的方式
    處理未修飾對(duì)象與修飾后的對(duì)象筑舅,實(shí)現(xiàn)了客戶端的透明操作,比如這里的Tea類陨舱。
  • ConcreteComponent具體組件翠拣,實(shí)現(xiàn)抽象組件中生命的方法,裝飾器
    類可以給他增加額外的責(zé)任(方法)游盲,比如這里的MilkTea和LemonTea误墓。
  • Decorator抽象裝飾類蛮粮,裝飾組件對(duì)象的,內(nèi)部一定要有一個(gè)指向
    組件對(duì)象的引用C栈拧H幌搿!通過(guò)該引用可以調(diào)用裝飾前構(gòu)建對(duì)象的方法欣范,并通過(guò)
    其子類擴(kuò)展該方法变泄,已達(dá)到裝飾的目的,比如這里的Decorator類恼琼。
  • ConcreteDecorator具體裝飾類妨蛹,抽象裝飾類的具體實(shí)現(xiàn),可以調(diào)用抽象
    裝飾類中定義的方法晴竞,也可以新增新的方法來(lái)擴(kuò)充對(duì)象的行為蛙卤。

UML類圖

適用場(chǎng)景

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

  • 在不影響其他對(duì)象的情況下,以動(dòng)態(tài)颤难、透明的方式給單個(gè)對(duì)象添加職責(zé);
  • 處理那些可以撤消的職責(zé)已维;
  • 當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí):一種情況是行嗤,可能有大量獨(dú)立的擴(kuò)展,
    為支持每一種組合將產(chǎn)生大量的子類衣摩,使得子類數(shù)目呈爆炸性增長(zhǎng)昂验。另一種情況
    可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類艾扮;

優(yōu)缺點(diǎn)

  • 擴(kuò)展對(duì)象功能既琴,比繼承靈活,不會(huì)導(dǎo)致類個(gè)數(shù)急劇增加泡嘴;
  • 可以通過(guò)一種動(dòng)態(tài)的方式在運(yùn)行時(shí)選擇不同的具體裝飾類甫恩,從而實(shí)現(xiàn)不同的行為;
  • 避免了高層次類有太多的特征酌予,可以從一個(gè)最簡(jiǎn)單的類慢慢給他添加功能磺箕;
  • 會(huì)產(chǎn)生很多小裝飾者對(duì)象,會(huì)影響性能抛虫,過(guò)多使用該模式也會(huì)使程序變得復(fù)雜松靡。

本節(jié)代碼

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市建椰,隨后出現(xiàn)的幾起案子雕欺,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屠列,死亡現(xiàn)場(chǎng)離奇詭異啦逆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)笛洛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門夏志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苛让,你說(shuō)我怎么就攤上這事沟蔑。” “怎么了狱杰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵溉贿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我浦旱,道長(zhǎng),這世上最難降的妖魔是什么九杂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任颁湖,我火速辦了婚禮,結(jié)果婚禮上例隆,老公的妹妹穿的比我還像新娘甥捺。我一直安慰自己,他們只是感情好镀层,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布镰禾。 她就那樣靜靜地躺著,像睡著了一般唱逢。 火紅的嫁衣襯著肌膚如雪吴侦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天坞古,我揣著相機(jī)與錄音备韧,去河邊找鬼。 笑死痪枫,一個(gè)胖子當(dāng)著我的面吹牛织堂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奶陈,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼易阳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吃粒?” 一聲冷哼從身側(cè)響起潦俺,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后黑竞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捕发,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年很魂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扎酷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遏匆,死狀恐怖法挨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幅聘,我是刑警寧澤凡纳,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站帝蒿,受9級(jí)特大地震影響荐糜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葛超,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一暴氏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绣张,春花似錦答渔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芜飘,卻和暖如春务豺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燃箭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工冲呢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人招狸。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓敬拓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裙戏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乘凸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容