vault backup: 2022-06-21 17:06:00
Affected files: 02. PARA/03. Resources(資源)/Design Pattern.md
This commit is contained in:
@@ -149,9 +149,10 @@ notify()則是當發生變化時,用來通知所有觀察者的實作。
|
||||
以書上的例子來說,我們多種飲料,每種飲料都可以加上不同的配料。例如,有奶茶、綠茶、紅茶3種飲料,另外有珍珠、紅豆、綠豆、仙草4種配料,我們要如何設計出適合的類別來讓每種飲料都可以隨寄的搭配配料呢?
|
||||
|
||||
假設這樣寫:
|
||||
|
||||
- !!!col
|
||||
- 1
|
||||
### Ingredient class
|
||||
Ingredient class
|
||||
```cpp
|
||||
class IngredientBubble { ... };
|
||||
class IngredientRedbean { ... };
|
||||
@@ -159,8 +160,8 @@ notify()則是當發生變化時,用來通知所有觀察者的實作。
|
||||
class IngredientFairyGrass { ... };
|
||||
```
|
||||
|
||||
- 2
|
||||
### Beverage class
|
||||
- 1
|
||||
Beverage class
|
||||
```cpp
|
||||
class Beverage {
|
||||
int32_t cost() { return cost; }
|
||||
@@ -217,12 +218,12 @@ class IngredientBubble : public Beverage {
|
||||
};
|
||||
```
|
||||
|
||||
珍珠這個class的 constructor 的參數是任何一個 Beverage,現在飲料被包在珍珠裡面,由珍珠來決定飲料最後的價格是多少。現在我們可以動態的決定飲料的組成,假設點一杯紅茶:
|
||||
珍珠這個class的 constructor 的參數是任何一個 Beverage,現在飲料被包在珍珠裡面,由珍珠來決定飲料最後的價格是多少。現在我們可以動態的決定飲料的組成,假設點一杯紅茶,加一些配料:
|
||||
```cpp
|
||||
int main() {
|
||||
...
|
||||
|
||||
// 這裡就先不考慮memory leak的問題...>_<
|
||||
// 為了讓程式看起來簡單,這裡就先不考慮memory leak的問題...>_<
|
||||
BeverageBlackTea* berverge = new BeverageBlackTea(); // 點一杯紅茶
|
||||
IngredientBubble* berverge = new IngredientBubble(berverge); // 加珍珠
|
||||
IngredientRedbean* berverge = new IngredientRedbean(berverge); // 加紅豆
|
||||
@@ -234,3 +235,8 @@ int main() {
|
||||
}
|
||||
```
|
||||
|
||||
可以看到第一個變數是飲料,然後被包珍珠裡面,變成珍珠紅茶,再被包到紅豆裡面,變成紅豆珍珠紅茶,再被包到仙草裡面,變成仙草紅豆珍珠紅茶,到這樣的好處是:
|
||||
1. 有新的配料就寫新配料的 class
|
||||
2. 因為可以動態的組合,原本寫好的飲料class就不用在去動它了,愈少修改,愈少 bug
|
||||
3. 我們可以動態的組合配料,要加2份以上也沒有問題
|
||||
|
||||
|
||||
Reference in New Issue
Block a user