行为型 状态模式

简介: 行为型 状态模式

状态模式(State Pattern):创建表示各种状态的对象和一个行为随着状态对象改变而改变的context对象。

状态模式:

概要分析:

将基于switch语句的大型状态该机转换为对象。

用不同的对象,不同的状态标志,实现不同的模块处理

源码Demo:

/*************************************************************************************************
状态模式:
  大白话就是,状态的改变依赖于内部变量的改变;  
在设计的时候要特别注意,
  要将状态设计成闭环,就是当所有条件不满足的时候,返回初始状态并给出提示“没有此状态”
State模式:
  允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
  状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
  把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
适用于:
  对象的行为,依赖于它所处的当前状态。行为随状态改变而改变的场景。
  适用于:通过用户的状态来改变对象的行为。  
状态接口:
状态模式:比较复杂,多种状态一定形成循环对其进行判断,状态的改变依赖于成员变量值的改变
比如:
  要有成员变量设置和得到此变量的值的功能
    要有得到当前状态状态的指针变量指向
    要有设置状态指针的操作
    要有执行的操作(根据指针指向的状态,使用状态指针去调用状态指向的重写函数)并携带当前对象,
      根据当前对象的成员变量的值进行不同的操作
      如果条件不满足就对多个状态进行遍历,先释放当前对象指针,然后设置下一个状态的状态,去调用下一个状态的成员函数,
      如果到最后一个状态还是不成立然后设置其状态为初始状态,在最后打印出没有此状态的信息。
实现方法;
  设定此类的某一状态值,根据此状态值去调用得到状态的函数,如果不满足就返回没有此状态,然后设置指针指向下一个状态。
**************************************************************************************************/
#include <iostream>
using namespace std;
class Worker;
//状态基类  子类实现不同状态的具体业务,提供对外接口
class State
{
public:
  virtual void doSomeThing(Worker *w) = 0;
  virtual ~State() {}
};
//状态管理者 根据传入的状态进行不同的函数调用
class Worker
{
public:
  Worker(){}
  ~Worker(){
    if(m_currstate!= NULL)
    {
      delete m_currstate;
      m_currstate = NULL;
    }
  }
  int getHour(){  return m_hour;  }
  void setHour(int hour){  m_hour = hour;}
  State* getCurrentState(){  return m_currstate;  }
  void setCurrentState(State* state){  m_currstate = state;  }
  void doSomeThing()  //这里可以保存状态类型修改状态变更
  {  
    m_currstate->doSomeThing(this);  
  } //调用者指针管理状态类
private:
  int  m_hour;
  State  *m_currstate; //对象的当前状态
};
class State2;
class State1 : public State
{
public:
  void doSomeThing(Worker *w);
};
class State2 : public State
{
public:
  void doSomeThing(Worker *w);
};
void State1::doSomeThing(Worker *w)
{
  if (w->getHour() == 7 || w->getHour() == 8){
    cout << "吃早饭" << endl;
  }else{
    delete w->getCurrentState();  //状态1 不满足 要转到状态2
    w->setCurrentState(new State2);
    w->getCurrentState()->doSomeThing(w); //
  }
}
void State2::doSomeThing(Worker *w)
{
  if (w->getHour() == 9 || w->getHour() == 10){
    cout << "工作" << endl;
  }
  else
  {
    delete w->getCurrentState(); //状态2 不满足 要转到状态3 后者恢复到初始化状态
    w->setCurrentState(new State1); //恢复到当初状态
    cout << "当前时间点:" << w->getHour() << "未知状态" << endl;
  }
}
int main()
{
  Worker *w1 = new Worker;
  State1 * s1 = new State1(); //内部保证释放了
  w1->setCurrentState(s1);
  w1->setHour(7);
  w1->doSomeThing();
  w1->setHour(9);//内部根据业务判断  改变了状态
  w1->doSomeThing();
  delete w1;
  // system("pause");
  return 0;
}
目录
相关文章
|
JavaScript 前端开发 IDE
QCAD v3.23.0.2源码编译,使用VS2017+Qt5.12.5环境
QCAD v3.23.0.2源码编译,使用VS2017+Qt5.12.5环境
1483 0
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
数字化转型需要的技术:生成式AI时代的全栈能力图谱
本文探讨生成式AI推动下的数字化转型技术需求转变,从技术本质、实施路径、伦理规制三方面解构核心要素。技术本质从工具理性进化到能力体系,需建立模型思维、多模态交互和自主进化能力。实施路径分为认知重构、实验验证与迭代优化三个阶段。同时,文章介绍生成式人工智能认证(GAI认证)的战略价值,强调其在能力基准建立、技术合作及创新生态接入中的作用。最后,文章分析组织能力进化与未来技术前沿,如认知智能、具身智能和群体智能的演进方向,为企业提供全面的技术赋能与战略转型指导。
|
算法 调度 UED
操作系统中的进程管理:原理与实践
在数字世界的心脏跳动着无数进程,它们如同细胞一般构成了操作系统的生命体。本文将深入探讨进程管理的奥秘,从进程的诞生到成长,再到最终的消亡,揭示操作系统如何协调这些看似杂乱无章却又井然有序的活动。通过浅显易懂的语言和直观的比喻,我们将一起探索进程调度的策略、同步机制的重要性以及死锁问题的解决之道。准备好跟随我们的脚步,一起走进操作系统的微观世界,解锁进程管理的秘密吧!
281 33
|
存储 运维 监控
阿里云 SAE 助力修正商城 3 周内提升系统承载能力 20 倍,轻松应对春晚流量
在 2024 年春节前夕,修正电商事业部面临了前所未有的技术挑战,修正将参与春晚的全民健康好礼派发的活动,且在央视及各大平台进行广告投放,预计流量激增至 16 亿,系统需要承载保底 5 万 QPS,目标 10 万 QPS。修正技术团队迫切需要升级 APP 架构以应对即将到来的超高并发场景。这一挑战不仅是对技术的考验,更是对修正品牌实力的一次展示。为了应对这次巨大的技术挑战,修正技术团队选择与阿里云云原生团队合作,进行 APP 架构的升级。
22736 7
|
存储 小程序 JavaScript
|
小程序 开发者
微信小程序斗地主完整代码及步骤
微信小程序斗地主完整代码及步骤
1550 0
|
消息中间件 安全 Java
如何为Kafka加上账号密码(一)
一直以来,我们公司内网的Kafka集群都是在裸奔,只要知道端口号,任何人都能连上集群操作一番。直到有个主题莫名消失,才引起我们的警觉,是时候该考虑为它添加一套认证策略了。
3286 2
|
前端开发 JavaScript
【开发规范系列】(四)前端开发规范(三)
【开发规范系列】(四)前端开发规范(三)
|
人工智能 网络协议 应用服务中间件
Hexo博客SSL证书到期,该如何免费续期更换?
Hexo博客SSL证书到期,该如何免费续期更换?
|
自然语言处理
Prompt之文本生成详解教程
Prompt之文本生成详解教程
814 0
Prompt之文本生成详解教程

热门文章

最新文章