ETH官方钱包

切換
舊版
前往
大廳
主題

Decorator Pattern - 裝飾者模式

默思 | 2017-03-21 19:36:18 | 巴幣 0 | 人氣 501

這次要來(lái)介紹Decorator Pattern(裝飾者模式),書本的說(shuō)明定義有看沒(méi)有懂,而且也不清楚,直接上例子比較快。

今天要點(diǎn)餐,假設(shè)今天只賣漢堡,而且算讓使用者點(diǎn)餐時(shí)有50%的優(yōu)惠,這時(shí)要怎麼做?

通常直覺(jué)的方法就是建立漢堡的class,然後在內(nèi)部寫是否要50%優(yōu)惠的方法,或是繼承漢堡class,寫個(gè)優(yōu)惠的方法,不過(guò)今天可能不只賣漢堡,可能有薯?xiàng)l阿或是炸雞之類的,這樣的方式很顯然不妥。

要如何將該問(wèn)題用裝飾者模式解決?

首先先上UML圖看一下架構(gòu)


首先定義一個(gè)Meal的abstract class(interface也行),Hamburger繼承Meal,這邊看起來(lái)沒(méi)啥問(wèn)題,接下來(lái)是Decorator的部分,它也是一個(gè)abstract class,但是它繼承了Meal,而下面的FiftyPercent又繼承了Decorator,這個(gè)FiftyPercent就是實(shí)際要用來(lái)裝飾漢堡的類別。

以下是程式碼跟結(jié)果:




從上面可以看到我又加了一顆蛋進(jìn)去


我個(gè)人是讓蛋繼承自Decorator,這樣蛋同時(shí)可以是餐點(diǎn),也可以是裝飾者
在輸出第二欄中,蛋是用裝飾者的身分去裝飾Hamburger,而第三欄則是單點(diǎn)蛋的情形(沒(méi)有優(yōu)惠)

單點(diǎn)蛋有優(yōu)惠如下:




書上對(duì)裝飾者模式的說(shuō)明:動(dòng)態(tài)地將責(zé)任加諸於物件上。若要擴(kuò)充功能,裝飾者提供比繼承更有彈性的選擇

看過(guò)例子之後大概對(duì)這句話有比較瞭解了

另外,在Java中,像FileInputStream這類繼承自InputStream的類別,也是使用Decorator Pattern

Github:點(diǎn)我

創(chuàng)作回應(yīng)

更多創(chuàng)作