Chapter5: 裝飾者模式 (Decorater Pattern)
Last updated
Last updated
1.Decorator Pattern
裝飾者模式要解決的問題:
1.當主要物件搭配上各種裝飾品(屬性, 配件, 配料等)後會形成各種新物件, 並且與本來的物件有本質的差異, 若逐一實踐每個組合則會有重複實踐以及後續維護等問題存在
例如飲料店有各種飲料, 每種飲料又可以添加各種配料, 其排列組合相當多
2.使用繼承雖然可以解決類別爆炸的問題, 但一旦有新的組合需要被實踐時就必須修改這個物件, 但這樣就違反了開放封閉原則, 因此並不是一個好作法(以下圖片引用自"深入淺出設計模式")
因此要如何解決以上問題呢? 就是利用裝飾者模式
元件 + 裝飾者 = 裝飾者模式
舉例來說, 客人希望一個darkroast咖啡, 或是darkroast的mocha咖啡, 又或是darkroast的mocha咖啡加上whip, 用裝飾者模式的做法就是將這三者拆開來, 因為其他種類的咖啡也可能會用到mocha或是whip(以下圖片引用自"深入淺出設計模式")
角色(以下圖片引用自"深入淺出設計模式")
裝飾者 (Decorator): 須實作的功能依需求而定
元件 (Component): 須實作的功能依需求而定
更仔細點觀察, 裝飾者與元件必須有相同的超類別, 也就是說必須實踐相同的Interface(以下圖片引用用自"深入淺出設計模式")
實踐相同的Interface是為了要有正確的型態, 而不是繼承他的行為. 行為是來自裝飾者與元件, 或和其他裝飾者間的合成關係
觀察者模式的優點
1.如同策略模式的優點, 藉由動態合成物件, 可以改寫新的程式碼擴充既有的系統而無需改變既有系統的程式碼
2.裝飾者模式動態地將責任加諸於物件上. 若要擴充功能, 裝飾者提供了比繼承更有彈性的選擇