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