1. 簡介
模板方法模式,行爲型設計模式。定義一個算法的執行骨架,而內部的操作步驟可由子類去做不同的實現。例如一些小遊戲如射擊、足球等,它們的執行過程都是一樣的,只是執行內容不同罷了,那麼這個執行過程(初始化、開始遊戲、結束遊戲)就是算法的骨架,而執行內容(射擊本身和足球本身的規則、內容不一樣)就是具體的操作內容。再比如,我們高中時經常會遇到同一類應用題,它們的解題思路都是基本一致的,而題目中的場景、數值是不一樣的,這其中解題思路就是骨架,而不同的場景和數值就對應不同子類的實現。
2. 類圖
模板方法模式的類圖比較簡單,就是單純的繼承關係,多個子類繼承同一個父類,主要的不同是,父類中有一個由上所述的骨架方法–模板方法。而類似初始化、開始、結束的這些方法爲抽象方法,由不同的子類去實現。
3. 代碼實例
有一種算法,它的過程都是先初始化、開始、結束,只是它的初始化、開始、結束的方法內容有多種版本。
package eaikao.templatemethod;
abstract class Algorithm {
abstract void init();
abstract void start();
abstract void end();
public final void process() {
init();
start();
end();
}
}
class AlgorithmA extends Algorithm {
@Override
void init() {
// TODO Auto-generated method stub
System.out.println("init AlgorithmA!");
}
@Override
void start() {
// TODO Auto-generated method stub
System.out.println("start AlgorithmA!");
}
@Override
void end() {
// TODO Auto-generated method stub
System.out.println("end AlgorithmA!");
}
}
class AlgorithmB extends Algorithm {
@Override
void init() {
// TODO Auto-generated method stub
System.out.println("init AlgorithmB!");
}
@Override
void start() {
// TODO Auto-generated method stub
System.out.println("start AlgorithmB!");
}
@Override
void end() {
// TODO Auto-generated method stub
System.out.println("end AlgorithmB!");
}
}
public class ETemplateMethod {
public static void main(String[] args) {
Algorithm algorithmA = new AlgorithmA();
algorithmA.process();
Algorithm algorithmB = new AlgorithmB();
algorithmB.process();
}
}
輸出內容:
init AlgorithmA!
start AlgorithmA!
end AlgorithmA!
init AlgorithmB!
start AlgorithmB!
end AlgorithmB!
如上就是模板方法設計模式,它主要將不變的行爲控制在父類中,而具體實現放在子類中,有利於可變部分的擴展。這種模式在我們項目中也經常使用到。是一種比較簡單並常用的設計模式。