類圖
定義
定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟
優點
- 封裝不變部分,擴展可變部分
- 提取公共部分代碼,便於維護
- 行爲由父類控制,子類實現缺點
- 根據習慣,抽象類負責聲明最抽象,最一般的事務屬性方法,實現類完成具體的事物屬性和方法,
但模板方法模式卻顛倒了,抽象類定義了部分抽象方法,由子類實現,子類執行的結果影響了父類的結果,即子類對父類產生了影響。
使用場景
- 多個子類有公有的方法,並且邏輯基本相同時
- 重要複雜的算法,可以把核心算法設計爲模板方法
- 重構時,將相同代碼抽取到父類中
注意事項
模板方法中經常出現的一個術語,鉤子方法。它是指在抽象類中某方法的返回值影響了模板方法的執行結果,則該方法被稱爲鉤子方法
抽象模板類
public abstract class AbstractClass {
/**
* 基本方法
*/
protected abstract void function1();
/**
* 基本方法
*/
protected abstract void function2();
/**
* 模板方法
*/
public void templateMethod() {
// 調用基本方法,完成相關邏輯
this.function1();
this.function2();
}
}
具體模板類1
public class ConcreteClass1 extends AbstractClass {
// 實現基本方法
@Override
protected void function1() {
// 完成邏輯處理
System.out.println("模板1->功能1");
}
@Override
protected void function2() {
// 完成具體邏輯
System.out.println("模板1->功能2");
}
}
具體模板類2
public class ConcreteClass2 extends AbstractClass {
// 實現基本方法
@Override
protected void function1() {
// 完成邏輯處理
System.out.println("模板2->功能1 new");
}
@Override
protected void function2() {
// 完成具體邏輯
System.out.println("模板2->功能2 new");
}
}
場景類
public class Client {
public static void main(String[] args) {
AbstractClass class1 = new ConcreteClass1();
AbstractClass class2 = new ConcreteClass2();
class1.templateMethod();// 執行模板方法
class2.templateMethod();// 執行模板方法
}
}
運行結果
模板1->功能1
模板1->功能2
模板2->功能1 new
模板2->功能2 new