定義與結構
模板方法(Template Method)模式:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。這裏的算法的結構,可以理解爲你根據需求設計出來的業務流程。特定的步驟就是指那些可能在內容上存在變數的環節。
可以看出來,模板方法模式也是爲了巧妙解決變化對系統帶來的影響而設計的。使用模板方法使系統擴展性增強,最小化了變化對系統的影響。這一點,在下面的舉例中可以很明顯的看出來。
來看下這個簡單模式的結構吧:
1) 抽象類(Abstract Class):定義了一到多個的抽象方法,以供具體的子類來實現它們;而且還要實現一個模板方法,來定義一個算法的骨架。該模板方法不僅調用前面的抽象方法,也可以調用其他的操作,只要能完成自身的使命。
2) 具體類(Concrete Class):實現父類中的抽象方法以完成算法中與特定子類相關的步驟。
模板方法模式的實現
//抽象類--Abstract Class
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//template method
public final void play()
{
//initialize the game
initialize();
//start game
startPlay();
//end game
endPlay();
}
}
//具體類--Concrete Class
public class Cricket extends Game {
@Override
void initialize() {
System.out.println("Cricket Game Initialized!Start Playing");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Cricket Game finished!");
}
}
//具體類--Concrete Class
public class Football extends Game {
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
驗證輸出
Cricket Game Initialized!Start Playing
Cricket Game Started. Enjoy the game!
Cricket Game finished!
Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!