上下文(Context):也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
抽象状态(State):定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
具体状态(Concrete State):实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。
代码:
/*状态模式*/
#include "iostream"
using namespace std;
// 状态类基类
class War;
class State // 抽象状态定义一个接口
{
public:
virtual void Prophase(War *war) {} // 前期
virtual void Metaphase(War *war) {} // 中期
virtual void Anaphase(War *war) {} // 后期
virtual void End(War *war) {} // 结束
virtual void CurrentState(War *war) {}
};
//战争 Context 上下文
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;
getchar();
return 0;
}
输出:
第1天:战争初期,双方你来我往,互相试探对方
第6天:战争初期,双方你来我往,互相试探对方
第11天:战争中期,进入相持阶段,双发各有损耗
第16天:战争中期,进入相持阶段,双发各有损耗
第21天:战争后期,双方拼死一搏
第26天:战争后期,双方拼死一搏
战争结束
战争结束
参考:
https://www.guyuehome.com/38612
标签:状态,void,State,模式,War,public,state,war From: https://www.cnblogs.com/huvjie/p/16705199.html