模板方法模式：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;
}

```

  


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
软件设计模式 |
| --- |
|  |
| 设计模式 | 

|  |  |
| --- | --- |
| 创建型 | 
* 抽象工厂
* 生成器
* 工厂方法
* 惰性初始
* 原型
* 单例

 |
|  |
| 结构型 | 
* 适配器
* 桥接
* Composite（英语：）
* 修饰
* 外观
* 享元
* 代理

 |
|  |
| 行为型 | 
* 责任链
* 命令
* Interpreter（英语：）
* 迭代器
* 中介者
* Memento（英语：）
* 观察者
* Specification（英语：）
* State（英语：）
* 策略
* 模板方法
* 访问者

 |

 |
|  |
| 并行模式 | 
* 主动对象（英语：）
* 阻止（英语：）
* Binding properties（英语：）
* 双重检查锁定模式
* 异步方法调用
* Future与promise
* Guarded suspension（英语：）
* Join（英语：）
* 锁
* Messaging（英语：）
* 监视器
* Proactor（英语：）
* 反应器
* 读写锁
* 调度
* 线程池
* 线程局部存储

 |
|  |
| 架构模式 | 
* ADR（英语：）
* 主动记录
* Broker（英语：）
* 主從式架構
* cbd
* DAO
* DDD
* Data transfer object（英语：）
* Front controller（英语：）
* Identity map（英语：）
* Interceptor（英语：）
* 控制反转
* MVC
* 微服務
* MVP
* 單體式應用程式
* 多层架构
* *n*-tier（英语：）
* Naked objects（英语：）
* P2P
* 发布/订阅
* REST
* SOA
* Specification（英语：）

 |
|  |
| 云分布式 | 
* 断路器
* CQRS（英语：）
* 补偿交易（英语：）
* 索引表
* 领导者选举（英语：）
* MapReduce
* 物化视图（英语：）
* 管道
* 过滤器（英语：）
* 发布/订阅
* 分片（英语：）
* 节流（英语：）

 |
|  |
| 其他模式 | 
* Blackboard（英语：）
* Business delegate（英语：）
* Composite entity（英语：）
* 委托
* 依赖注入
* Intercepting filter（英语：）
* 惰性載入
* Method chaining（英语：）
* 模拟对象
* 空对象
* 对象池
* Servant（英语：）
* Twin（英语：）
* Type tunnel（英语：）

 |
|  |
| 书籍 | 
* 设计模式：可复用面向对象软件的基础
* 企业集成模式（英语：）

 |
|  |
| 人物 | 
* 克里斯托佛·亚历山大
* 埃里希·伽瑪
* Ralph Johnson（英语：）
* John Vlissides（英语：）
* 葛來迪·布區
* 肯特·貝克
* 沃德·坎宁安
* 马丁·福勒
* Robert Martin（英语：）
* Jim Coplien（英语：）
* Douglas Schmidt（英语：）
* Linda Rising

 |
|  |
| 社区 | 
* The Hillside Group（英语：）
* The Portland Pattern Repository（英语：）

 |

 |