在笔者看来这是第一次比较有技术含量的设计模式,State模式,顾名思义,每个对象可能在不同的阶段拥有不同的状态,同时在不同的状态应该执行的是不同的行为,所以对于
Context的构造指出就应该有State的存在表示当前所处的状态,同时对于每个不同的状态的行为也应该在State类对象中包含,因为行为的不同是因为状态的不同,下图就是
State模式的示意图
#include"stdafx.h"
#include
using namespace std;
class State
{
public:
State(){;}
virtual void OperationInterface()=0;
virtual void OperationChangeState(Context*)=0;
~State(){;}
protected:
virtual bool CHangeState(Context*con,State*sta)
{
con->ChangeState(sta);
return true;
}
};
class ConcreteStateA:public State
{
public:
ConcreteStateA(){;}
~ConcreteStateA(){;}
void OperationInterface(Context*con)
{
cout<<"ConcreteStateA::OperationInterface\n";
}
void OperationChangeState(Context*con,State* sta)
{
OperationInterface(con);
this->ChangeState(con,new ConcreteStateB());//在这新建了另一个状态,然后调用Context的变换状态
}
};
class ConcreteStateB:public State
{
public:
ConcreteStateB(){;}
~ConcreteStateB(){;}
void OperationInterface(Context*con)
{
cout<<"ConcreteStateB::OperationInterface\n";
}
void OperationChangeState(Context*con,State* sta)
{
OperationInterface(con);
this->ChangeState(con,new ConcreteStateA());//在这新建了另一个状态,然后调用Context的变换状态
}
};
class Context
{
private:
State* m_state;
friend class State;
public :
Context(State*st)
{
m_state=st;
}
~Context()
{
if(m_state!=NULL)
delete m_state;
}
void OperationInterface()
{
m_state->OperationInterface(this);
}
void OperationChangeState()
{
m_state->OperationChangeState(this);
}
private:
void ChangeState(State*sta)
{
//该函数不能直接调用,只能在State类中进行调用。,首先是OperationChangeState->ConcreteStateA::OperationChangeSTate-//ConcreteStateA::OperationInterface->Sate::ChangeState->Context::ChangeState
m_state=sta;
}
}};
int main()
{
State* sta=new ConcreteStateA();
Context*con=new Context();
con->OperationInterface();
con->OperationChangeState();
}