這次要來(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)我