模板方法这个名字看着非常陌生,事实上在游戏中大量地使用了模板方法。由于游戏中存在玩家、NPC和静态物体等不同的对象,使用多态特性能非常好地进行区分。
模板方法的定义是:模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够在不改变算法结构的情况下,又一次定义算法中的某些步骤。
举个最简单的玩家和NPC死亡时的逻辑:
流程图例如以下:
代码例如以下
// MVC.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Object
{
public:
Object():m_dead(0)
{
}
void SetDead()
{
cout<<"========================="<<endl;
BeforeDead();
Ondead();
AfterDead();
cout<<"========================="<<endl;
}
virtual void BeforeDead()
{
}
virtual void AfterDead()
{
}
void Ondead()
{
cout<<"Skill End"<<endl;
cout<<"you are dead!"<<endl;
}
bool IsDead()
{
return m_dead;
}
private:
bool m_dead;
};
class Player:public Object
{
public:
virtual void BeforeDead()
{
cout<<"Interrupt trade if you are trading!"<<endl;
}
virtual void AfterDead()
{
cout<<"nothing!"<<endl;
}
};
class NPC:public Object
{
public:
virtual void BeforeDead()
{
cout<<"Call BeforeDead Lua Script!"<<endl;
}
virtual void AfterDead()
{
cout<<"Call AfterDead Lua Script!"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
auto_ptr<Player> player(new Player());
auto_ptr<NPC> npc(new NPC());
cout<<"Player dead!"<<endl;
player->SetDead();
cout<<"NPC dead!"<<endl;
npc->SetDead();
}
模板方法的长处是将共性在父类中实现,将差异化在不同的子类中实现。