今天是状态模式。
状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
下面是状态模式的UML图:
下面是C++实现的代码:
/*
* initm.com
* 作者:Stupid
* 时间:2017-10-31 22:23
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为状态模式的基本结构代码。
*/
#include <QCoreApplication>
#include <iostream>
class Context;
class State
{
public:
virtual void PrintType() = 0;
virtual void Handle(Context* context) = 0;
virtual ~State(){}
};
class Context
{
private:
State* state;
public:
Context(State* const& state): state(state){
state->PrintType();
}
void SetState(State* const& state){
this->state = state;
state->PrintType();
}
State* GetState(){
return state;
}
void Request(){
state->Handle(this);
}
};
class ConcreteStateA: public State
{
public:
void Handle(Context* context)override final;
void PrintType()override final{
std::cout << "ConcreteStateA" << std::endl;
}
};
class ConcreteStateB: public State
{
public:
void Handle(Context* context)override final{
if(nullptr != context->GetState()){
delete context->GetState();
}
context->SetState(new ConcreteStateA);
}
void PrintType()override final{
std::cout << "ConcreteStateB" << std::endl;
}
};
class ConcreteStateC: public State
{
public:
void Handle(Context* context)override final{
if(nullptr != context->GetState()){
delete context->GetState();
}
context->SetState(new ConcreteStateB);
}
void PrintType()override final{
std::cout << "ConcreteStateC" << std::endl;
}
};
void ConcreteStateA::Handle(Context* context){
if(nullptr != context->GetState()){
delete context->GetState();
}
context->SetState(new ConcreteStateC);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Context* context = new Context(new ConcreteStateA);
context->Request();
context->Request();
context->Request();
context->Request();
return a.exec();
}
状态模式是通过Context类来决定何时更换状态的,更换状态后,Context的表现也就变了。