状态模式

  1. 上下文(Context):也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。

  2. 抽象状态(State):定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。

  3. 具体状态(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

posted @ 2022-09-18 16:44  double64  阅读(41)  评论(0)    收藏  举报