vault backup: 2022-06-21 17:16:00

Affected files:
02. PARA/03. Resources(資源)/Design Pattern.md
This commit is contained in:
2022-06-21 17:16:00 +08:00
parent 3b5e2312ee
commit 4fb413fc24

View File

@@ -149,10 +149,9 @@ notify()則是當發生變化時,用來通知所有觀察者的實作。
以書上的例子來說我們多種飲料每種飲料都可以加上不同的配料。例如有奶茶、綠茶、紅茶3種飲料另外有珍珠、紅豆、綠豆、仙草4種配料我們要如何設計出適合的類別來讓每種飲料都可以隨寄的搭配配料呢 以書上的例子來說我們多種飲料每種飲料都可以加上不同的配料。例如有奶茶、綠茶、紅茶3種飲料另外有珍珠、紅豆、綠豆、仙草4種配料我們要如何設計出適合的類別來讓每種飲料都可以隨寄的搭配配料呢
假設這樣寫: 假設這樣寫:
- !!!col - !!!col
- 1 - 1
Ingredient class ### Ingredient class
```cpp ```cpp
class IngredientBubble { ... }; class IngredientBubble { ... };
class IngredientRedbean { ... }; class IngredientRedbean { ... };
@@ -161,7 +160,7 @@ notify()則是當發生變化時,用來通知所有觀察者的實作。
``` ```
- 1 - 1
Beverage class ### Beverage class
```cpp ```cpp
class Beverage { class Beverage {
int32_t cost() { return cost; } int32_t cost() { return cost; }
@@ -201,9 +200,9 @@ class BeverageBlackTea {
}; };
``` ```
這樣的問題是每當有一種新配料出現我們就要在奶茶類別裡修改至少2個functionaddXXX()cost()目前我們有3種飲料所以要修改6個function更何況如果客人要加2份珍珠怎麼辦這明顯不利程式的維護必須有一種方法讓程式的修改最小讓寫好的程式不用被修改才行。 這樣的問題是每當有一種新配料出現我們就要在奶茶類別裡修改至少2個 function`addXXX()` 與 `cost()`目前我們有3種飲料所以要修改6個 function更何況如果客人要加2份珍珠怎麼辦這明顯不利程式的維護必須有一種方法讓程式的修改最小讓寫好的程式不用被修改才行。
讓裝飾者模式來改善這個問題。首先讓配料跟飲料有同樣的界面,但是修改一下配料的 constructor當然也要實作cost(),畢竟每個配料的價格不同: 讓裝飾者模式來改善這個問題。首先讓配料跟飲料有同樣的界面,但是修改一下配料的 constructor當然也要實作 `cost()`,畢竟每個配料的價格不同:
```cpp ```cpp
class IngredientBubble : public Beverage { class IngredientBubble : public Beverage {
IngredientBubble(Beverage* beverage) { IngredientBubble(Beverage* beverage) {
@@ -239,4 +238,3 @@ int main() {
1. 有新的配料就寫新配料的 class 1. 有新的配料就寫新配料的 class
2. 因為可以動態的組合,原本寫好的飲料 class 就不用在去動它了,愈少修改,愈少 bug 2. 因為可以動態的組合,原本寫好的飲料 class 就不用在去動它了,愈少修改,愈少 bug
3. 我們可以動態的組合配料要加2份以上也沒有問題 3. 我們可以動態的組合配料要加2份以上也沒有問題