TemplateMethodパターンの書き方をざっくり説明

TemplateMethodパターンとは

基底クラスに定型化した処理手順を定義し、処理部分を派生クラスで実装するパターン
Template Method パターン - Wikipedia

実装方法

class cBase
{
public:
    cBase() {}
    ~cBase() {}
    virtual void Init() { std::cout << "cBase::Init()" << std::endl; }
    virtual void Update() { std::cout << "cBase::Update()" << std::endl; }
    virtual void Render() { std::cout << "cBase::Render()" << std::endl; }
    void Show()
    {
        Init();
        Update();
        Render();
    }
};

class cTitle : public cBase
{
public:
    cTitle() {}
    ~cTitle() {}
    virtual void Init() { std::cout << "cTitle::Init()" << std::endl; }
    virtual void Update() { std::cout << "cTitle::Update()" << std::endl; }
    virtual void Render() { std::cout << "cTitle::Render()" << std::endl; }
};

class cGame : public cBase
{
public:
    cGame() {}
    ~cGame() {}
    virtual void Init() { std::cout << "cGame::Init()" << std::endl; }
    virtual void Update() { std::cout << "cGame::Update()" << std::endl; }
    virtual void Render() { std::cout << "cGame::Render()" << std::endl; }
};

class cEnding : public cBase
{
public:
    cEnding() {}
    ~cEnding() {}
    virtual void Init() { std::cout << "cEnding::Init()" << std::endl; }
    virtual void Update() { std::cout << "cEnding::Update()" << std::endl; }
    virtual void Render() { std::cout << "cEnding::Render()" << std::endl; }
};

cBaseクラスに定型処理を定義し、cTitle、cGame 、cEnding の各クラスに処理を書いている状態です。
cBaseのshow関数はInit、Update、Render関数を呼び出すようにしています。

実行してみる

int main()
{
    std::unique_ptr<cBase> scene;

    scene.reset(new cTitle);
    scene->Show();

    scene.reset(new cGame);
    scene->Show();

    scene.reset(new cEnding);
    scene->Show();

    return 0;
}

実行結果

f:id:haina817:20180221002049p:plain

思ったこと

ゲーム作ってるとほぼ100%目にするってくらい定石なものです(多分ゲーム以外でも同じだと思う)
シーン管理だったりメニュー画面やダイアログだったり...
やっぱり面倒な定型処理を書かなくて済むのはすごく便利ですよねー