0. 简介

状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。这其实就有点类似算法中的有限状态机的形式。

其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。 不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则被称为转移。

1. 状态模式示意图

策略模式和状态模式两个模式很相似,区别就在于策略模式对象初始化的时候更改执行模式,而状态模式是根据对象实例的周期时间而动态地改变对象实例的执行模式。 所以当对象需要根据自身当前状态进行不同行为, 同时状态的数量非常多且与状态相关的代码会频繁变更的话, 可使用状态模式。

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

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

具体状态(Concrete State):实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。

2. 示例代码

我们可以知道,状态模式在函数内部就自己包含有一套逻辑判断用于实现子类与子类之间的相互调用,从而影响数据流的走向,这也要求我们要对代码的流程和逻辑有充分的验证。

// 状态类基类
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;
}

3. 状态模式的优缺点


状态可被视为策略的扩展。 两者都基于组合机制: 它们都通过将部分工作委派给 “帮手” 对象来改变其在不同情景下的行为。 策略使得这些对象相互之间完全独立, 它们不知道其他对象的存在。 但状态模式没有限制具体状态之间的依赖, 且允许它们自行改变在不同情景下的状态

…详情请参照古月居

C++之状态(State)模式相关推荐

  1. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  2. 设计模式:状态(State)模式

    设计模式之状态(State)模式 在软件开发过程中,应用程序中的有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态.当有状态 ...

  3. 设计模式--状态(State)模式

    模式定义 允许一个对象在其内部状态改变时改变它的行为,从而使对象看起来似乎修改了其行为 类图 要点总结 State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时, ...

  4. 状态(State)模式

    状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的 ...

  5. java state用法_Java状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elsei ...

  6. 状态转移表+State模式

    为了给用户提供更好的体验方式,多级联动,多种选择方式,半智能化的容错能力等是我们采用的手段,同时这对软件的开发带来了更多的复杂性.我们需要考虑在各种不同状态下,按钮的功能,以及转换. 在我做过的若干项 ...

  7. 理解vuex -- vue的状态管理模式

    2019独角兽企业重金招聘Python工程师标准>>> vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管 ...

  8. Android学习 StateMachine与State模式

    2019独角兽企业重金招聘Python工程师标准>>> 一 State模式 意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(Objects for ...

  9. java状态机设计模式_设计模式总结-State模式

    不同的状态,不同的行为;或者说,每个状态有着相应的行为. 二.State模式的适用场合: State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif ...

最新文章

  1. 重新启动正在运行的linux,下面哪个命令行可用来马上重新启动正在运行的Linux系统()。A.restart--delay=0B.reboot-wC.halt-p...
  2. Win32 ASM 菜单编程Demo以及Win32 ASM 为什么需要等值定义
  3. vmstat命令使用
  4. c#位数不够0补充完_C# 位数不足补零
  5. 消失模设计与加工(FM-CAM)
  6. 项目模板参数化(上)
  7. winlogon病毒清除
  8. asp.net中前台javascript与c#函数相互调方法
  9. bag of words matlab,Bag of words(matlab实现)
  10. 使用allegro画PCB的基本流程:
  11. jBridge避开云服务器让AI算力落地的桥联框架技术
  12. 阿里云盘 Mac客户端(附福利码)
  13. 信息安全行业含金量较高的2个认证(建议都看一下)
  14. 我的2018OKR年终回顾与2019OKR初步规划
  15. 使用预训练模型训练YOLOv3-Keras
  16. 微信小程序标题栏加logo–基于IView-weapp
  17. 「ZBrush」学习ZB出来可以从事什么工作?小白都知道吗?
  18. 手持式信号综合分析仪 天馈线驻波比频谱分析仪 天馈线+频谱+干扰分析仪 4.4GHZ无线综合测试仪
  19. IOS 发布被拒 PLA 1.2问题 整个过程介绍 03 个人账户升级公司账户
  20. spec服务器性能测评,SPEC CPU 2006测试运算性能_服务器评测与技术-中关村在线

热门文章

  1. PHP通常用哪种web服务器,常见的几种WEB服务器配置方案分享
  2. matlab之矩阵乘法与点乘
  3. Rust使用winapi创建窗口
  4. PAC学习框架-模型定义
  5. 今日报错系列:未定义的SYSTEMTIME
  6. 全能赛道、热门方向、稀缺数据,不能错过的自动驾驶技术挑战赛
  7. c语言rtrim函数返回值,C语言的Trim, LTrim, RTrim
  8. MySQL海量数据优化(理论+实战)
  9. 西门子PLC S7-200系列有哪些基本硬件及优点?
  10. 手机交电费以及后续报销流程操作