## 設計模式的解析與活用 - ch19
# Template Method
---
## Agenda
- Template Method 意圖
- Template Method 減少重複與實務經驗
- Template Method 關鍵特徵
---
## 意圖
定義一個操作中的演算法的骨架,將一些步驟延遲到子類別中,不改變演算法的結構而重新定義他的步驟
白話文:也就是抽象類別擷取共通的部分,將差異點封裝在衍生類別,Template Method 就是控制不同過程中的相同處流程
---
## 類似的流程
- 使用複製貼上導致重複,邏輯異動容易漏改,變化也難維護(組合爆炸)
- query 範例

---
## 建議修改流程
- 比較程式碼,找出重複片段,進行重構
- 使用 Extract 方法
- 建立基礎類別,保留不會變的部分
- 如果一開始設計就注意到,是可以避免走到重構步驟,透過不斷實踐可以加強下次遇到提早做好規劃
- 重構時不要加新功能
- 妥善運用模式,達到維護品質,並且不會增加工作量
---
## 關鍵特徵

---
## 其他參考
- [做飲料為例](https://corrupt003-design-pattern.blogspot.com/2016/07/template-method-pattern.html)
- [蓋房子為例](https://refactoring.guru/design-patterns/template-method)

---
## 問題與討論
- Template Method 模式的意圖是在不改變演算法的結構前提,重新定義他的步驟,這是什麼意思?
- 為什麼此章節介紹的模式命名取為 Template Method?
- Strategy 模式與 Template Method 模式有何差異?
---
## 備忘
- 此模式整理出一個流程,在不改變演算內涵的前提,僅把相同、重複的片段定義在父類別,不同的片段提取至子類別處理,執行順序仍不會變
- 已經有一個「樣板流程」,一但有新的類別要加入,只要根據差異處去實作子類別的函示,整體流程仍是比照已完成的樣板的定義
- Strategy vs Template Method
後者,處理類似但是不相同的過程,聚焦在有關聯性的過程。
前者,處理相同目的但實作過程不同的模式
{"metaMigratedAt":"2023-06-17T17:25:06.326Z","metaMigratedFrom":"YAML","title":"Template Method","breaks":true,"slideOptions":"{\"theme\":\"beagi\",\"transition\":\"slide\"}","contributors":"[{\"id\":\"4920227a-8d5d-43bf-a64c-f92a0ab5021e\",\"add\":1675,\"del\":387}]"}