diff --git a/02. PARA/03. Resources(資源)/Design Pattern.md b/02. PARA/03. Resources(資源)/Design Pattern.md index ffb04b5..12d3820 100644 --- a/02. PARA/03. Resources(資源)/Design Pattern.md +++ b/02. PARA/03. Resources(資源)/Design Pattern.md @@ -167,9 +167,9 @@ notify()則是當發生變化時,用來通知所有觀察者的實作。 int32_t cost; } - class BeverageMilkTea { ... }; - class BeverageGreenTea { ... }; - class BeverageBlackTea { + class BeverageMilkTea : public Beverage { ... }; + class BeverageGreenTea : public Beverage { ... }; + class BeverageBlackTea : public Beverage { IngredientBubble* bubble; IngredientRedbean* redbean; IngredientGreenbean* greenbean; @@ -202,6 +202,35 @@ class BeverageBlackTea { 這樣的問題是,每當有一種新配料出現,我們就要在奶茶類別裡修改至少2個function,addXXX()與cost(),目前我們有3種飲料,所以要修改6個function,更何況,如果客人要加2份珍珠怎麼辦?這明顯不利程式的維護,必須有一種方法讓程式的修改最小,讓寫好的程式不用被修改才行。 -讓裝飾者模式來改善這個問題。首先讓配料跟飲料有同樣的界面,但是修改一下配料的constructor: -```c[] -``` \ No newline at end of file +讓裝飾者模式來改善這個問題。首先讓配料跟飲料有同樣的界面,但是修改一下配料的 constructor,當然也要實作cost(),畢竟每個配料的價格不同: +```cpp +class IngredientBubble : public Beverage { + IngredientBubble(Beverage* beverage) { + this->beverage = beverage; + } + + int32_t cost() { + return 10 + this->beverage->cost(); // 珍珠要加10元,在加上原本飲料的價錢 + } + + Beverage* beverage; +}; +``` + +珍珠這個class的 constructor 的參數是任何一個 Beverage,現在飲料被包在珍珠裡面,由珍珠來決定飲料最後的價格是多少。現在我們可以動態的決定飲料的組成,假設點一杯紅茶: +```cpp +int main() { + ... + + // 這裡就先不考慮memory leak的問題...>_< + BeverageBlackTea* berverge = new BeverageBlackTea(); // 點一杯紅茶 + IngredientBubble* berverge = new IngredientBubble(berverge); // 加珍珠 + IngredientRedbean* berverge = new IngredientRedbean(berverge); // 加紅豆 + IngredientFairyGrass* berverge = new IngredientFairyGrass(berverge); // 加仙草 + + ... + + return berverge->cost(); // 算價錢 +} +``` +