本文的參考文章及書籍如下:
https://mp.weixin.qq.com/s/v4jEeegy911hqhqnIC8s5w
http://cmsblogs.com/?p=4967
《head first設(shè)計(jì)模式》
1.裝飾器模式的概述
裝飾能使其一件物品到達(dá)更好或者更美的效果眶根,例如我們?nèi)ベI奶茶的時(shí)候都希望能多加更多的佐料辕宏,因?yàn)樘砑雍螅?/p>
會(huì)使奶茶更豐富蛤高,更好喝,添加入的紅豆特纤、布丁等就是對(duì)奶茶進(jìn)行裝飾,又如玩過(guò)LOL的都知道買更多更好的裝備才能使英雄
變得更強(qiáng),裝備也是對(duì)英雄的一種裝飾吊骤。我們又如何對(duì)這樣子需要修飾的業(yè)務(wù)做設(shè)計(jì)呢?
2.裝飾器模式的應(yīng)用
如果我們不加思索按照最原始的方式去編寫的話善玫,可能會(huì)這樣設(shè)計(jì)水援,一個(gè)奶茶的基類,各種佐料的實(shí)體類茅郎,然后和
奶茶組合實(shí)現(xiàn)各種各樣的基類蜗元,我們這樣實(shí)現(xiàn)下去的話,到后面會(huì)發(fā)現(xiàn)各式各樣的組合越來(lái)越多系冗,品類越來(lái)越繁雜奕扣,如果改動(dòng)
了一個(gè)地方可能會(huì)引發(fā)多個(gè)地方產(chǎn)生不同的bug,使用裝飾器模式將能夠解決這樣的困境掌敬。為此業(yè)務(wù)編寫一個(gè)偽代碼惯豆。如下
UML類圖池磁,我們將對(duì)該UML類圖進(jìn)行解析。
Drink(飲品)通用接口楷兽,show()為展示自己描述的方法地熄,teaMilk為奶茶實(shí)現(xiàn)Drink基類。Decorator為裝飾器芯杀,持有Drink
為用來(lái)裝飾它端考,show為描述具體裝飾的方法。BuDding(布督液瘛)為具體的裝飾器却特,繼承裝飾器,是為了繼承類別不繼承其方法筛圆,
因此都需實(shí)現(xiàn)自己show方法裂明,RedBean(紅豆)也為具體裝飾器。
3.具體的偽代碼實(shí)現(xiàn)
Drink接口的實(shí)現(xiàn)如下圖:
TeaMilk具體實(shí)現(xiàn)如下圖:
Decorator具體實(shí)現(xiàn)如下圖:
BuDding具體實(shí)現(xiàn)如下圖:
RedBean具體實(shí)現(xiàn)如下圖:
Client具體實(shí)現(xiàn)如下圖:
我們通過(guò)控制臺(tái)可以觀察到奶茶被紅豆和布丁所裝飾了起來(lái)太援,當(dāng)我們需要添加入別的佐料闽晦,只需要新建一個(gè)類,并實(shí)現(xiàn)
它的方法即可粉寞,這樣更方便我們進(jìn)行擴(kuò)展尼荆。
裝飾器的缺點(diǎn)是會(huì)創(chuàng)建許多的子類,在jdk中IO流就是運(yùn)用了裝飾器模式唧垦,我們是否會(huì)是不是的用到該代碼:
new BufferedReader(new FileReader("temp.txt")); 具體可查看源碼捅儒。