動作モード - テンプレート メソッド モード (TEMPLATE METHOD)

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 を返します。}











おすすめ

転載: blog.csdn.net/rukawashan/article/details/124574414