意图:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用性:
一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

例子一:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Context;
class State
{
public:
State(){}
~State(){}
virtual void Handle(Context* pcontext){}
};
class Context
{
public:
Context(){}
Context(State *pstate):m_pstate(pstate){}
~Context(){}
void Request()
{
if (m_pstate)
{
m_pstate->Handle(this);
}
}
void ChangeState(State *p)
{
if (NULL != m_pstate)
{
delete m_pstate;
m_pstate = NULL;
}
m_pstate = p;
}
private:
State *m_pstate;
};
class ConcreteState1 :public State
{
public:
//ConcreteState1(){}
void Handle(Context* pcontext);
};
class ConcreteState2 :public State
{
public:
//ConcreteState2(){}
void Handle(Context* pcontext);
};
void ConcreteState1::Handle(Context* pcontext)
{
cout << "这是第1种状态" << endl;
pcontext->ChangeState(new ConcreteState2());
}
void ConcreteState2::Handle(Context* pcontext)
{
cout << "这是第2种状态" << endl;
pcontext->ChangeState(new ConcreteState1());
}
int main()
{
State *state = new ConcreteState1();
Context *context = new Context(state);
context->Request();
context->Request();
context->Request();
context->Request();
}
例子二:借鉴别人例子,只为学习,不为商用
以战争为例,假设一场战争需经历四个阶段:前期、中期、后期、结束。当战争处于不同的阶段,战争的行为是不一样的,也就说战争的行为取决于所处的阶段,而且随着时间的推进是动态变化的。下面给出相应的UML图。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class War;
class State
{
public:
virtual void Prophase() {}
virtual void Metaphase() {}
virtual void Anaphase() {}
virtual void End() {}
virtual void CurrentState(War *war) {}
};
//战争
class War
{
private:
State *m_state; //目前状态
int m_days; //战争持续时间
public:
War(State *state) : m_state(state), m_days(0) {}
~War() { delete m_state; }
int GetDays() { return m_days; }
void SetDays(int days) { m_days = days; }
void SetState(State *state) { delete m_state; m_state = state; }
void GetState() { m_state->CurrentState(this); }
};
//战争结束
class EndState : public State
{
public:
void End(War *war) //结束阶段的具体行为
{
cout << "战争结束" << endl;
}
void CurrentState(War *war) { End(war); }
};
//后期
class AnaphaseState : public State
{
public:
void Anaphase(War *war) //后期的具体行为
{
if (war->GetDays() < 30)
cout << "第" << war->GetDays() << "天:战争后期,双方拼死一搏" << endl;
else
{
war->SetState(new EndState());
war->GetState();
}
}
void CurrentState(War *war) { Anaphase(war); }
};
//中期
class MetaphaseState : public State
{
public:
void Metaphase(War *war) //中期的具体行为
{
if (war->GetDays() < 20)
cout << "第" << war->GetDays() << "天:战争中期,进入相持阶段,双发各有损耗" << endl;
else
{
war->SetState(new AnaphaseState());
war->GetState();
}
}
void CurrentState(War *war) { Metaphase(war); }
};
//前期
class ProphaseState : public State
{
public:
void Prophase(War *war) //前期的具体行为
{
if (war->GetDays() < 10)
cout << "第" << war->GetDays() << "天:战争初期,双方你来我往,互相试探对方" << endl;
else
{
war->SetState(new MetaphaseState());
war->GetState();
}
}
void CurrentState(War *war) { Prophase(war); }
};
//测试案例
int main()
{
War *war = new War(new ProphaseState());
for (int i = 1; i < 40; i += 5)
{
war->SetDays(i);
war->GetState();
}
delete war;
return 0;
}