状态模式

  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 @   double64  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-09-18 C# 集合之 ArrayList
2021-09-18 英语|你能明白我的意思吗
点击右上角即可分享
微信分享提示