1 定義
定義一個算法中的操作框架,而將算法中的一些步驟進行抽象,使這些步驟延遲到子類中去實現,從而實現子類不改變算放結構就可以重定義算法的某些特定步驟。
2 類圖及實例
通過定義的描述我們知道了模板方法模式中的抽象類有一些模板方法,這些模板方法中會調用一些基本方法(抽象方法),而這些基本方法的實現就交給了子類來完成。
具體代碼實現如下:
/**
* 抽象父類
*/
abstract class AbstractClass{
/**
* 基本方法1
*/
protected abstract void basicMethodOne();
/**
* 基本方法2
*/
protected abstract void basicMethodTwo();
/**
* 模板方法
*/
public final void templateMethod(){
basicMethodOne();
basicMethodTwo();
}
}
class concreteClass1 extends AbstractClass{
@Override
protected void basicMethodOne() {
System.out.println("I'm basicMethodOne in concreteClass1");
}
@Override
protected void basicMethodTwo() {
System.out.println("I'm basicMethodTwo in concreteClass1");
}
}
class concreteClass2 extends AbstractClass{
@Override
protected void basicMethodOne() {
System.out.println("I'm basicMethodOne in concreteClass2");
}
@Override
protected void basicMethodTwo() {
System.out.println("I'm basicMethodTwo in concreteClass2");
}
}
3 模板方法模式的優缺點
(1)優點
- 封裝不變部分,擴展可變部分。
- 提取公共部分代碼便於維護。
- 行爲由父類控制,子類實現。
(2)缺點
按照一般的設計思路,抽象類負責完成最基礎的方法,而具體的方法使用及實現由子類完成。而模板方法模式的設計思路正好相反,這樣會增加代碼的閱讀難度。
4 使用場景
(1)多個子類有相同的方法,並且基本邏輯相同。
(2)重要的、複雜的算法,可以將核心算法抽象成模板,然後子類實現周邊算法。
(3)針對重構的時候,可以將相同的算法抽象成模板,針對不同的部分由子類實現。