java 中的模板方法實現
模板方法模式是一種行為設計模式,它定義操作中演算法的程式框架,將一些步驟推遲到子類。
結構體:
主要說明:
- 模板方法使用繼承
- 不應覆蓋基類實現的 Template 方法。這樣,演算法的結構由超類控制,細節在子類中實現
程式碼示例:
import java.util.List;
class GameRule{
}
class GameInfo{
String gameName;
List<String> players;
List<GameRule> rules;
}
abstract class Game{
protected GameInfo info;
public Game(GameInfo info){
this.info = info;
}
public abstract void createGame();
public abstract void makeMoves();
public abstract void applyRules();
/* playGame is template method. This algorithm skeleton can't be changed by sub-classes. sub-class can change
the behaviour only of steps like createGame() etc. */
public void playGame(){
createGame();
makeMoves();
applyRules();
closeGame();
}
protected void closeGame(){
System.out.println("Close game:"+this.getClass().getName());
System.out.println("--------------------");
}
}
class Chess extends Game{
public Chess(GameInfo info){
super(info);
}
public void createGame(){
// Use GameInfo and create Game
System.out.println("Creating Chess game");
}
public void makeMoves(){
System.out.println("Make Chess moves");
}
public void applyRules(){
System.out.println("Apply Chess rules");
}
}
class Checkers extends Game{
public Checkers(GameInfo info){
super(info);
}
public void createGame(){
// Use GameInfo and create Game
System.out.println("Creating Checkers game");
}
public void makeMoves(){
System.out.println("Make Checkers moves");
}
public void applyRules(){
System.out.println("Apply Checkers rules");
}
}
class Ludo extends Game{
public Ludo(GameInfo info){
super(info);
}
public void createGame(){
// Use GameInfo and create Game
System.out.println("Creating Ludo game");
}
public void makeMoves(){
System.out.println("Make Ludo moves");
}
public void applyRules(){
System.out.println("Apply Ludo rules");
}
}
public class TemplateMethodPattern{
public static void main(String args[]){
System.out.println("--------------------");
Game game = new Chess(new GameInfo());
game.playGame();
game = new Ludo(new GameInfo());
game.playGame();
game = new Checkers(new GameInfo());
game.playGame();
}
}
說明:
-
Game
是一個abstract
超類,它定義了一個模板方法:playGame()
-
playGame()
的骨架在基類中定義:Game
-
像
Chess, Ludo
和Checkers
這樣的子類不能改變playGame()
的骨架。但他們可以修改一些步驟的行為createGame(); makeMoves(); applyRules();
輸出:
Make Chess moves
Apply Chess rules
Close game:ChessCreating Ludo game
Make Ludo moves
Apply Ludo rules
Close game:LudoCreating Checkers game
Make Checkers moves
Apply Checkers rules
Close game:Checkers```