這次要來介紹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:點我