行为型 状态模式

简介: 行为型 状态模式

状态模式(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;
}
目录
相关文章
|
7月前
行为型 中介者模式
行为型 中介者模式
41 0
|
5天前
|
设计模式 算法 C#
状态模式
状态模式(State Pattern)是一种行为设计模式,允许对象在内部状态变化时改变其行为。通过将状态相关的逻辑封装到独立的状态类中,实现了状态与行为的解耦。核心组件包括 Context、State 和 ConcreteState,适用于对象行为依赖于其状态且状态频繁变化的场景。优点是结构清晰、扩展性强,但可能会导致类数量增加和状态转换复杂。
37 10
|
2月前
|
设计模式 算法 C#
C# 一分钟浅谈:策略模式与状态模式
【10月更文挑战第13天】本文介绍了两种常见的行为型设计模式:策略模式和状态模式。策略模式通过封装一系列算法并使其可互换,实现算法的灵活变化;状态模式则通过改变对象的内部状态来改变其行为。文章通过C#代码示例详细说明了这两种模式的应用场景、常见问题及解决方法。
59 19
|
设计模式
设计模式-行为型模式:状态模式
设计模式-行为型模式:状态模式
|
7月前
|
设计模式 安全 C++
行为型 备忘录模式
行为型 备忘录模式
50 1
|
设计模式 JavaScript
关于状态模式我所知道的
关于状态模式我所知道的
67 0
|
设计模式
我学会了,状态模式
状态模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
117 0
我学会了,状态模式
|
设计模式 算法
|
存储 程序员 开发工具
状态模式与备忘录模式(2)
状态模式与备忘录模式(2)
149 0
状态模式与备忘录模式(2)
下一篇
DataWorks