模板方法

模板方法模式:UML類圖

模板方法模型是一種行為設計模型和设计模式模板方法(template method)是一個定義在父類別的方法,负责处理流程、算法的不变部分。模板方法會调用多個定義在父類別的其他工具方法(helper method),而這些方法是算法的可变部分,有可能只是抽象方法並沒有實作。模板方法僅決定這些抽象方法的執行順序,這些抽象方法由子類別負責實作,並且子類別不允許覆盖模板方法(即不能重写处理流程)。


这种设计模式是一种控制反转的实现方式。因为高层代码不再确定(控制)算法的处理流程。

用法

[编辑]

模板方法模式多用在:

  • 某些類別的演算法中,實做了相同的方法,造成程式碼的重複。
  • 控制子類別必須遵守的一些事項。
  • ...

用例(Java)

[编辑]
 /**   * An abstract class that is common to several games in   * which players play against the others, but only one is   * playing at a given time.   */    abstract class Game {        private int playersCount;        abstract void initializeGame();        abstract void makePlay(int player);        abstract boolean endOfGame();        abstract void printWinner();        /* A template method : */      final void playOneGame(int playersCount) {          this.playersCount = playersCount;          initializeGame();          int j = 0;          while (!endOfGame()){              makePlay(j);              j = (j + 1) % playersCount;          }          printWinner();      }  }  //Now we can extend this class in order to implement actual games:   class Monopoly extends Game {        /* Implementation of necessary concrete methods */        void initializeGame() {          // ...      }        void makePlay(int player) {          // ...      }        boolean endOfGame() {          // ...      }        void printWinner() {          // ...      }         /* Specific declarations for the Monopoly game. */        // ...    }   class Chess extends Game {        /* Implementation of necessary concrete methods */        void initializeGame() {          // ...      }        void makePlay(int player) {          // ...      }        boolean endOfGame() {          // ...      }        void printWinner() {          // ...      }         /* Specific declarations for the chess game. */        // ...    }   public class Player {      public static void main(String[] args) {          Game chessGame = new Chess();          chessGame.initializeGame();          chessGame.playOneGame(1); //call template method      }  } 

C++ 例子

[编辑]
#include<iostream>  // abstract class BaseClass {  protected: 	virtual void someMethod() = 0; public: 	void ThisIsTemplateMethod() { someMethod(); } };  class ExtendedClass_one : public BaseClass { protected: 	void someMethod() override { 		puts("[ExtendedClass_one] Re-Define method here."); 	} }; class ExtendedClass_two : public BaseClass { protected: 	void someMethod() override { 		puts("[ExtendedClass_two] Re-Define method here."); 	} };  int main() {  	BaseClass* one = new ExtendedClass_one; 	one->ThisIsTemplateMethod();  	BaseClass* two = new ExtendedClass_two; 	two->ThisIsTemplateMethod();  	return 0; }