利用多态替代Switch语句的模板示例
代码把这个链接下的代码改了一下,看了半天(还是太菜了),发现根本用不着this 指针。为防止更多的人看晕,写了一个模板代码。
源代码链接.
同时如果用switch的话,那么就是这个链接里的第一个写法。
模板代码
详解见注释
#include <stdio.h>
class Context;
class State
{
public:
State() {}
virtual ~State() {}
virtual void showMessage() = 0;//纯虚构函数,子类重写
};
class MessageOne :public State
{
public:
MessageOne() {}
~MessageOne() {}
void showMessage()
{
printf("This is message one\n");
}
};
class MessageTwo :public State
{
public:
MessageTwo() {}
~MessageTwo() {}
void showMessage()
{
printf("This is message two\n");
}
};
class MessageThree :public State
{
public:
MessageThree() {}
~MessageThree() {}
void showMessage()
{
printf("This is message three\n");
}
};
class Context
{
public:
Context(State* pState) : m_pState(pState) {}
void Request()
{
if (m_pState)
{
m_pState->showMessage();//核心步骤,根据m_Pstate指针指向的
//类型进行选择调用子类的函数。虚函数使得其可以实现基类指针调用基类指针所指
//向的子类象的函数。动态绑定。
}
}
void ChangeState(State* pState)
{
m_pState = pState;//改变指针指向的类的类型
}
private:
State* m_pState;
};
int main()
{
State* pStateA = new MessageOne();
State* pStateB = new MessageTwo();
State* pStateC = new MessageThree();
Context* pContext = new Context(pStateA);
pContext->Request();
pContext->ChangeState(pStateB);
pContext->Request();
pContext->ChangeState(pStateC);
pContext->Request();
delete pContext;
delete pStateC;
delete pStateB;
delete pStateA;
return 0;
}
运行结果:
实现的本质是虚函数的应用。如果虚函数不懂的话,建议先去学习虚函数。