1. 意図
操作のアルゴリズムのスケルトンを定義し、一部のステップをサブクラスに任せます。テンプレート メソッドを使用すると、サブクラスは、アルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義できます。
2. 構造
3.テンプレートモードとストラテジーモードの違い
戦略パターン: 一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、それらを交換可能にします。重要な点は、各アルゴリズムがプロセス統合され、独立していることです。
テンプレート メソッド モード: テンプレートは、実行のステップやシーケンスなどのスケルトンを定義します。スケルトンの一部は親クラスで実装されますが、サブクラスのパーソナライズされた動作はサブクラスの継承によって実装されます。
違いの本質は、戦略パターンがプロセス全体を置き換えることです。テンプレート モードは、固定プロセスの特定のコンテンツを置き換えます。
4. 例
//template.h
#pragma once
#include <iostream>
クラス テンプレート
{ public: virtual ~Template() = default;
仮想ボイドoperate1()= 0;
仮想ボイドoperate2()= 0;
ボイドメソッド()
{ operate1(); 操作2(); } };
class Concrete1 : public Template
{ public: void 操作 1() { std::cout << "Concrete1 操作 1\n"; } void 操作 2() { std::cout << "Concrete1 操作 2\n"; }
};
class Concrete2 : public Template
{ public: void 操作 1() { std::cout << "Concrete2 操作 1\n"; } voidoperate2() { std::cout << "Concrete2operate2\n"; }
};
//main.cpp
#include <memory>
#include "template.h"
int main(int argc, char* argv[]) { std::shared_ptr<Template> tmplt_ptr = std::make_shared<Concrete1>(); tmplt_ptr->メソッド();
tmplt_ptr = std::make_shared<Concrete2>();
tmplt_ptr->メソッド();
0 を返します。
}
5. 例 2
クラス DPGamesFramework
{ 保護されています: virtual bool loadingGame(); virtual bool startGame(); virtual bool playingGame(); 仮想ブール endGame(); public: virtual void Run() final; 仮想 ~DPGamesFramework(); プライベート: void errorLog(std::string funcName); };
void DPGamesFramework::Run()
{ if (!loadingGame()) { errorLog("loadingGame"); 戻る; } if (!startGame()) { errorLog("startGame"); 戻る; } if (!playingGame()) { errorLog("playingGame"); 戻る; } if (!endGame()) { errorLog("endGame"); 戻る; } }
クラス DPCjGame : public DPGamesFramework
{ public: bool loadingGame(); bool startGame(); ブールプレイングゲーム(); ブールエンドゲーム(); }; int main() { DPGamesFramework* cjGame = 新しい DPCjGame(); cjGame->Run(); 0 を返します。}