標(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,你仿佛特意在逗我笑叙谨,
![](http://static.zybuluo.com/coder-pig/0fjgcayzbcbm18cekv2bm0b7/3.jpg)
每個(gè)組合都寫一個(gè)温鸽,這他么得寫多少個(gè),而且用戶總是
![](http://static.zybuluo.com/coder-pig/hfdbfa1jninz9x7pkxn3612i/1.png)
每多一種配料,就得增加一堆飲品雹姊,玩毛股缸。
我們必須想一個(gè)更優(yōu)的套路,這個(gè)時(shí)候可以考慮引入裝飾者模式吱雏,
簡(jiǎn)單來(lái)說(shuō)就是:一層套一層,比如說(shuō)要椰果珍珠奶茶:
奶茶 --> 套一層珍珠 --> 珍珠(奶茶) --> 套一層椰果 --> 椰果(珍珠(奶茶))
逼逼那么多瘾境,代碼演示下吧歧杏!
代碼實(shí)現(xiàn)
先定義一個(gè)抽象茶的父類,定義茶的名字與定義價(jià)格的抽象方法
![](http://static.zybuluo.com/coder-pig/okh96v4gbhr750vm0u32agxp/image_1b6vi39mqs9p185a191hpdf1e2t21.png)
接著定義配料的抽象類迷守,所有配料都來(lái)繼承這個(gè)東東
![](http://static.zybuluo.com/coder-pig/2xjr50d27k8nbphjz9638a48/image_1b6vi9rar1u7arq31ati1ls5rmg2e.png)
好的犬绒,接著定義基本茶品,奶茶和檸檬茶
![](http://static.zybuluo.com/coder-pig/rgqnc9q21g4ic4ey0g0w1k3r/image_1b6vicqdm1l4uk91hqs6581fo92r.png)
![](http://static.zybuluo.com/coder-pig/88f2lqfhnqmvigmdsvfwl55i/image_1b6vsss4r11mi10lv1398cm1ma95c.png)
接著是各種配料兑凿,珍珠凯力,椰果,紅豆礼华,金桔咐鹤,都是繼承配料類
![](http://static.zybuluo.com/coder-pig/rehdtblnk5td49o2rb2dgb2k/image_1b6vq9o6te6vt0t1ogq1aca6fe3o.png)
![](http://static.zybuluo.com/coder-pig/frouwtlt0upw55k71o83nla7/image_1b6vrfpp8lus1qt0nap1cog1c7s45.png)
![](http://static.zybuluo.com/coder-pig/v2im7qj91pqkaeuq994flfwh/image_1b6vsk9sv16sb39m16vu1h9j7q24i.png)
![](http://static.zybuluo.com/coder-pig/rhn5v73jaj5yqdi6ohhvm4pj/image_1b6vsqgn5gm6as2k1r19qhpqd4v.png)
接著開(kāi)始自由搭配了:
![](http://static.zybuluo.com/coder-pig/ca8uduhsskl9xdud4oitnlym/image_1b6vt2e21gnj12jielbct11vm5p.png)
打單:
![](http://static.zybuluo.com/coder-pig/8puozpv9a7q4wz7gifw7v1iz/image_1b6vt45l5112v1oojbo21vak9bk66.png)
可以,沒(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類圖
![](http://static.zybuluo.com/coder-pig/4mee113z2t9bgu9tpl07ttly/image_1b709i6ej1fvs1a2519n410lg1evn9.png)
適用場(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