定義:Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s stucture. 即爲某一操作我們確定一種算法框架,但卻將其某些步驟延遲到子類完成,使得子類可以在不改變該算法架構的情況下確定其特定實現步驟。換句話說,父類將某操作拆分成多個細小的操作,而讓子類去確定如何完成這些細小的操作,父類只需要定義這些操作的執行順序,從而完成特定的事情。
而在父類(稱爲抽象模板)中,這些被拆分得到的細小操作被稱爲基本方法,具體由子類去實現,而父類中實現的關於基本方法的調用順序的方法稱爲模板方法。
首先,先列出一個典型的類圖:
其中,AbstractClass爲抽象模板,其基本方法step0()和step1()由子類去實現,而在模板方法templateMethod()中定義了其調用過程。下面的例子以中西方吃飯過程爲例,看代碼:
/**
* Created by Song on 2016/9/6.
* 抽象模板
*/
public abstract class AbstractClass {
//步驟0(基本方法)
protectedabstract void step0();
//步驟1(基本方法)
protectedabstract void step1();
//模板方法
public void templateMethod(){
//確定基本方法的調用順序,完成特定功能
this.step0();
this.step1();
}
}
**
* Created by Song on 2016/9/6.
* 具體類1
*/
public class ConcreteClass1 extends AbstractClass {
@Override
protectedvoid step0() {
System.out.println("步驟0:拿起筷子");
}
@Override
protectedvoid step1() {
System.out.println("步驟1:開始吃飯");
}
}
**
* Created by Song on 2016/9/6.
*/
public class ConcreteClass2 extends AbstractClass {
@Override
protectedvoid step0() {
System.out.println("步驟0:拿起刀叉");
}
@Override
protectedvoid step1() {
System.out.println("步驟1:開始吃飯");
}
}
**
1. Created by Song on 2016/9/6.
2. 測試類
*/
public class Main {
public static void main(String [] args){
//中國人的吃飯方式
System.out.println("中國人吃飯過程:");
AbstractClass chinese = new ConcreteClass1();
chinese.templateMethod();
//西方人的吃飯方式
System.out.println("西方人吃飯過程:");
AbstractClass foreigner = new ConcreteClass2();
foreigner.templateMethod();
}
}
執行結果:
其典型特點爲:
1. 封裝不變部分,擴展可變部分
2. 行爲由父類控制,而具體細節由子類根據實際需要實現。