封裝算法: 模板方法(Template Method)模式
template method(模板方法)模式是一種行為型設計模式。它在一個方法中定義了算法的骨架(這種方法被稱為template method。模板方法),並將算法的詳細步驟放到子類中去實現。template method使得子類能夠不改變一個算法的結構就可以重定義該算法的某些特定步驟。
須要指出的是,這裏所說的template並非c++中的模板。
適用性
算法的骨架事先已確定,僅僅是算法的某些步驟的詳細實如今不同的子類中有所不同
優點
- 算法的基本骨架已確定,子類能夠方便地實現算法的變體
- 避免代碼的反復,算法的步驟已經在父類中定義。子類依據須要僅僅須實現某些步驟就可以
應用
template method常常被應用在框架(framework)中,在框架中定義了通用的實現和基礎的功能,並為詳細的實現預留了“占位符”,框架的使用者僅僅須要又一次定義這些“占位符”就可以。
實現
首先我們定義一個抽象類Game。
在Game類中定義了一個聲明為final的template method: play()。
play()方法包括了三個方法的調用,分別為initialize(),startPlay(),endPlay(),這三個方法都聲明為abstract類型,表明在子類中須要詳細實現這些方法。
Game.java
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();
}
}
接著。我們定義了Basketball和Football類,它們都是Game的子類,並重寫了當中的initialize()。startPlay()。endPlay()方法。
Basketball.java
public class Basketball extends Game {
@Override
void endPlay() {
System.out.println("Basketball Game Finished!");
}
@Override
void initialize() {
System.out.println("Basketball Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Basketball Game Started. Enjoy the game!");
}
}
Football.java
public class Football extends Game {
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}
最後,我們編寫測試類,例如以下:
TemplatePatternDemo.java
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Basketball();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
程序的輸出例如以下:
Basketball Game Initialized! Start playing.
Basketball Game Started. Enjoy the game!
Basketball Game Finished!Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!
參考資料
- https://en.wikipedia.org/wiki/Template_method_pattern
- http://www.javacodegeeks.com/2013/03/template-method-design-pattern-in-java.html
- http://www.tutorialspoint.com/design_pattern/template_pattern.htm
封裝算法: 模板方法(Template Method)模式