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

Affected files:
02. PARA/03. Resources(資源)/Design Pattern.md
This commit is contained in:
2022-06-21 16:56:00 +08:00
parent 2ebac4af16
commit 7e083574b4

View File

@@ -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個functionaddXXX()與cost()目前我們有3種飲料所以要修改6個function更何況如果客人要加2份珍珠怎麼辦這明顯不利程式的維護必須有一種方法讓程式的修改最小讓寫好的程式不用被修改才行。
讓裝飾者模式來改善這個問題。首先讓配料跟飲料有同樣的界面但是修改一下配料的constructor
```c[]
```
讓裝飾者模式來改善這個問題。首先讓配料跟飲料有同樣的界面,但是修改一下配料的 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(); // 算價錢
}
```