定義
就是定義算法骨架的方法 具體的操作:在模板中直接實現某些步驟的方法,通常這些步驟的實現算法是固定的,而且是不怎麼變化的,因此就可以當作公共功能實現在模板裏面。
其實寫設計模式的系列筆記就是一種模板方法,每篇文章的流程(目錄)都是一樣的,我實現了每個部分的具體細節。
模板
模板方法比較簡單,第一次聽到這個概念的時候,發現原來自己一種用的叫做模板方法。
就是在抽象類中實現模板方法TemplateMethod,而這個方法裏面具體用到了多個具體流程如PrimitiveOperation1/PrimitiveOperation2, 子類只要繼承抽象模板並且實現具體流程,就能對外提供模板方法的能力。
實例
abstract class Shoping {
// 模板方法,由父類實現,可以定義爲final
public final void buyGood() {
login();
order();
pay();
}
abstract void login();
abstract void order();
abstract void pay();
}
JingdongBuy extends Shoping {
public void login() {
Log.d("登錄京東賬號");
}
public void order() {
Log.d("生成京東訂單");
}
public void pay() {
Log.d("使用京東白條支付");
}
}
TaobaoBuy extends Shoping {
public void login() {
Log.d("登錄淘寶賬號");
}
public void order() {
Log.d("生成淘寶訂單");
}
public void pay() {
Log.d("使用支付寶支付");
}
}
優點
模板方法注重抽象不同操作之間的共同點,剖離不同點。
求同存異: 將共同點在抽象類中實現,不同的具體實現保留在各個子類。
- 減少重複代碼,發便後續擴展與維護
- 符合開閉原則,子類可以對功能進行擴展
缺點
- 增加抽象類
- 代碼閱讀難度增大(需要到子類中找實現)
注意: 抽象過度可能會導致後期擴展麻煩,儘量保證模板流程以後不會再變更