首页 > 其他分享 >状态模式

状态模式

时间:2022-09-18 16:55:18浏览次数:94  
标签:状态 void State 模式 War public state war

  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

标签:状态,void,State,模式,War,public,state,war
From: https://www.cnblogs.com/huvjie/p/16705199.html

相关文章

  • 重学Java设计模式 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1zFJn7Ls5yEPOBijRMd82cQ点击这里获取提取码 ......
  • 设计模式 -- Strategy(策略模式)
    Strategy(策略模式)定义一系列算法,把他们一个个封装起来,并且是他们可以互相替换(变化)。该模式似的算法可以独立于使用它的客户程序(稳定的)而变化(扩展,子类)动机(Motivation)在软......
  • 组合模式
    理论 组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。  透明方式与安全方式透明......
  • 商业模式定义
    商业模式是指企业为了实现其客户价值的最大化,把能使企业运行的内部资源和外部相关要素进行有效的整合,形成一个完整,高效率的,具有独特核心竞争力的企业运行系统,并通过最有的......
  • 单例模式
    单例模式就是只有一个对象饿汉式1、将构造器私有化2、在类中直接创建一个私有对象(static)3、向外暴露一个静态公共方法,返回对象  懒汉式1.将构造器私有化2、......
  • JAVA设计模式-工厂模式
    JAVA设计模式-工厂模式简单工厂模式介绍简单工厂模式就是定义一个工厂类,工厂类提供获取实例的方法,方法会根据传入的参数不同来返回不同的实例。不同的实例基本都有共同......
  • 适配器模式
    Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。该角色把其他类转换为我们期望的接口Adapter(适配器类):将被适配者和目标接口组合......
  • MVC,大家都知道的模式……不太好
    MVC,大家都知道的模式……不太好“MVC是引用最多(也是最错误引用)的模式之一”——MartinFowlerCréditphoto:史蒂夫·约翰逊与许多关于这个主题的文章和评论相反,......
  • Jmeter远程服务模式运行时引用csv文件的路径配置
    问题在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考......
  • 设计模式
    1.单例模式-饿汉实现步骤:1.构造器私有化。2.类的内部创建对象。3.向外暴漏一个静态的公共方法。getInstance使用场景:publicclassFindGirlFriend{//......