当前位置: 首页 > news >正文

设计模式之状态机模式

一、状态机模式说明

状态机模式(State Machine Pattern)是一种用于描述对象行为的软件设计模式,属于行为型设计模式。在状态机模式中,对象的行为取决于其内部状态,并且在不同的状态下,对象可能会有不同的行为。这种模式通常涉及定义一组状态以及状态之间的转换规则,从而实现对对象行为的精确控制。

状态机类图:
在这里插入图片描述
1.1、状态机模式元素说明:

1、状态(Status): 表示对象所处的特定状态。每个状态都定义了对象在该状态下的行为

2、上下文(Context):上下文是包含状态机的对象。它维护了当前状态,并在状态之间的转换发生时更新状态。

3、转换(Transition):描述了对象从一个状态转移到另一个状态的过程。它通常受到一些条件或触发事件的影响。

4、动作(Action):动作是状态转换期间可能执行的操作或行为。这些动作可以是更新状态、执行计算、发送消息等。

1.2、状态机的特点:

1、清晰的状态管理:通过明确定义系统的所有可能状态以及在这些状态之间的转换,帮助开发者清晰地管理和跟踪系统的状态。

2、简化复杂逻辑:将复杂的条件分支逻辑转换为状态图,使得逻辑更加直观易懂。

3、易于维护和扩展:状态机的结构使得对系统的修改和扩展变得更加容易。通过添加新的状态和转换规则,可以轻松适应需求的变化。

4、提高可测试性:由于状态机的行为是预定义的,因此可以更系统地进行测试,有助于确保系统的正确性和可靠性。

二、状态机举例代码

模拟一个简单的交通信号灯系统,它有三种状态:红灯(Red)、绿灯(Green)、黄灯(Yellow)。每个状态都有一个特定的行为,即打印出当前灯的颜色,并且每个状态都可以转换到下一个状态。

定义一个TrafficLightState接口,它表示交通信号灯的所有可能状态:

public interface TrafficLightState {void change(TrafficLightContext context);
}

每种状态实现这个接口:

public class RedLightState implements TrafficLightState {  @Override  public void change(TrafficLightContext context) {  System.out.println("红灯亮");  context.setState(new GreenLightState());  }  
}  public class GreenLightState implements TrafficLightState {  @Override  public void change(TrafficLightContext context) {  System.out.println("绿灯亮");  context.setState(new YellowLightState());  }  
}  public class YellowLightState implements TrafficLightState {  @Override  public void change(TrafficLightContext context) {  System.out.println("黄灯亮");  context.setState(new RedLightState());  }  }

定义TrafficLightContext类,它包含了当前的状态,并且提供了一个方法来改变状态:


public class TrafficLightContext {  private TrafficLightState state;  public TrafficLightContext() {  this.state = new RedLightState();  }  public void setState(TrafficLightState state) {  this.state = state;  }  public void change() {  state.change(this);  }  
}

创建一个客户端来模拟交通信号灯的状态变化:

public class Client {public static void main(String[] args) {TrafficLightContext context = new TrafficLightContext();for (int i = 0; i < 10; i++) {context.change();}}
}

控制台输出结果:
在这里插入图片描述

TrafficLightContext类维护了当前的交通信号灯状态,并且提供了一个change方法来改变状态。每个状态类都实现了TrafficLightState接口,并且在其change方法中定义了下一个状态。客户端通过调用TrafficLightContext的change方法来模拟交通信号灯的状态变化。

现实中的状态转变,比这个复杂多了,一个状态节点可能有多个action操作,类似订单状态的流转,无法直接套用状态机模式,应该有记录状态变迁的全景图(核心要素:当前状态,当前状态可选动作,动作执行后状态迁移)

以下是一个简单的例子,记录当前状态,可选动作及执行动作后状态的一个例子,用于约束状态的变迁

public class StateMachine {private Map<String, Map<String, String>> stateMap;public StateMachine() {stateMap = new HashMap<String, Map<String, String>>();// 初始状态可以执行的Action及执行后的动作Map<String, String> initActionMap = new HashMap<String, String>();initActionMap.put("runAction", "run");stateMap.put("init", initActionMap);// run状态下可以执行的动作Map<String, String> runActionMap = new HashMap<String, String>();runActionMap.put("stopAction", "stop");runActionMap.put("sleepAction", "sleep");runActionMap.put("endAction", "end");stateMap.put("run", runActionMap);// sleep状态下可以执行的动作Map<String, String> sleepActionMap = new HashMap<String, String>();sleepActionMap.put("runAction", "run");stateMap.put("sleep", sleepActionMap);// stop状态下可以执行的动作Map<String, String> stopActionMap = new HashMap<String, String>();stopActionMap.put("runAction", "run");stateMap.put("stop", stopActionMap);}public String getNextState(String curState, String action) {Map<String, String> curStateMap = stateMap.get(curState);if (curStateMap == null) {System.out.println("curState error");return "";}String nextState = curStateMap.get(action);if (nextState == null) {System.out.println("acction error");return "";}return nextState;}public static void main(String[] args) {StateMachine sm = new StateMachine();String nextState = sm.getNextState("init", "runAction");System.out.println(nextState);nextState = sm.getNextState("run", "stopAction");System.out.println(nextState);nextState = sm.getNextState("stop", "runAction");System.out.println(nextState);nextState = sm.getNextState("run", "endAction");System.out.println(nextState);nextState = sm.getNextState("stop", "endAction");System.out.println(nextState);nextState = sm.getNextState("stops", "endAction");System.out.println(nextState);}
}

执行结果:
在这里插入图片描述

三、总结

状态机模式是一种强大的工具,能够帮助开发者在软件开发中处理复杂的逻辑和状态管理问题。通过明确定义系统的状态和转换规则,状态机模式使得系统的行为更加清晰、可控和易于维护。同时,状态机模式还具有广泛的应用场景和灵活的实现方式,适用于多种复杂的软件开发需求。

http://www.dtcms.com/a/356189.html

相关文章:

  • hive udf函数实现在sql查询网站价格
  • Vue3 中的 v-model 语法糖
  • (Nginx)基于Nginx+PHP 驱动 Web 应用(上):配置文件与虚拟主机篇
  • 基于SQL大型数据库的智能问答系统优化
  • 安卓开发---SimpleAdapter
  • 不同卷积不同的滤波效果
  • 如何将OFD文件转换为PDF?总结在线OFD转PDF方法
  • QT5.14.2、CMake 扩展openCV
  • GPT-5原理
  • 第二章 Vue + Three.js 实现鼠标拖拽旋转 3D 立方体交互实践
  • Python- Visual Studio Code配置Anaconda
  • WebIDEPLOY 赋能数字校园建设:智慧管理系统的效能升级与实践路径 —— 以校园资源协同优化构建高效教育生态的探索
  • 洞悉核心,驭数而行:深入理解 Oracle SQL 优化器(RBO 与 CBO)的性能调优哲学
  • C# 一个投资跟踪程序的设计与实现:面向对象与设计模式的深度解析
  • ros、slam、激光雷达、自动驾驶相关学习内容和计划
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day15
  • PyTorch 机器学习基础(选择合适优化器)
  • 【Big Data】Alluxio 首个基于云的数据分析和开源AI数据编排技术
  • 补题报告08
  • 从零开始的云计算生活——第五十四天,悬梁刺股,kubernetes模块之组件与网络
  • 计算机是如何运行的
  • Kotlin 和 Java 的区别
  • 【Linux系统】线程控制
  • 《C++进阶之STL》【AVL树】
  • PlotJuggler如何安装和使用
  • JavaSE丨集合框架入门(二):从 0 掌握 Set 集合
  • DeepSeek大模型风靡云平台,百度智能云、阿里云、腾讯云等多个平台宣布上线DeepSeek模型
  • HGDB全文检索/中文分词的使用
  • 美食推荐|美食推荐小程序|基于微信小程序的美食推荐系统设计与实现(源码+数据库+文档)
  • 【项目思维】通过编写一个贪吃蛇小程序,并移植到嵌入式设备上,解析编程思维的本质