裝飾者模式(Decorator Pattern)

Tay’s Log
2 min readDec 4, 2017

--

Q1:飲料店訂單系統,各種不同的飲料,也可以要求在其中加入各種佐料
A1:設計一個base class Beverage 含有計算價錢之方法cost,每個子類別覆寫cost()
缺點:類爆炸,ex:CoffeeWithMilk、CoffeeWithSugar、TeaWithSugar…etc,維護不易,如果Milk價錢改變怎麼辦?

A2:設計一個base class Beverage 含有各種佐料properties和計算價錢之方法cost(算佐料價錢)
每個子類別覆寫cost()(super.cost+基本飲料價錢)
缺點:
1.改變佐料價錢會改變現有程式,一但出現新的佐料,我們就需要改變cost方法
2.並非所有佐料適合子類別飲料。例如茶加上奶泡

*重要的設計原則: 類別應該對擴展開放,對修改關閉。

我們的目標是允許類容易擴展,在不修改現有的代碼情況下,就可搭配新的行為,
這樣的設計能應對改變,可以接受新的功能來應對改變的需求。

*A3:以飲料為主體,在運行時用佐料來裝飾(decorate)飲料
裝飾者&被裝飾者同樣繼承相同Component

裝飾著模式:動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。

裝飾者與被裝飾者同類型
飲料&佐料同父類別(為了相容而不是繼承行為)

Strategy pattern vs. Decorator pattern
Strategy pattern 主要是改變class的行為
Decorator pattern 主要是在現有的方法上增加額外的功能

Sample code :
https://github.com/Wei789/Design-Pattern/tree/master/DecoratorPattern/DecoratorPattern.playground

--

--

Tay’s Log
Tay’s Log

Written by Tay’s Log

這個Blog是為了讓有一顆金魚腦的宅宅工程師,用來記錄用的。

No responses yet