切換
舊版
前往
大廳
主題

Decorator Pattern - 裝飾者模式

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

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

今天要點餐,假設今天只賣漢堡,而且算讓使用者點餐時有50%的優惠,這時要怎麼做?

通常直覺的方法就是建立漢堡的class,然後在內部寫是否要50%優惠的方法,或是繼承漢堡class,寫個優惠的方法,不過今天可能不只賣漢堡,可能有薯條阿或是炸雞之類的,這樣的方式很顯然不妥。

要如何將該問題用裝飾者模式解決?

首先先上UML圖看一下架構


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

以下是程式碼跟結果:




從上面可以看到我又加了一顆蛋進去


我個人是讓蛋繼承自Decorator,這樣蛋同時可以是餐點,也可以是裝飾者
在輸出第二欄中,蛋是用裝飾者的身分去裝飾Hamburger,而第三欄則是單點蛋的情形(沒有優惠)

單點蛋有優惠如下:




書上對裝飾者模式的說明:動態地將責任加諸於物件上。若要擴充功能,裝飾者提供比繼承更有彈性的選擇

看過例子之後大概對這句話有比較瞭解了

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

Github:點我

創作回應

更多創作