状态机在C#上位机中使用总结
本以为状态机是很高深的知识,没想到在平时项目中早就用到了。虽然只是最简单的使用,但逻辑是相同的,于是就学习了一下状态模式的写法,方便以后在复杂的项目中使用。
基本概念
- 状态(State):系统在特定时刻所处的状况或模式
例如上位机的"停止"、"运行"、"暂停"、"紧急停止"等状态 - 事件(Event):触发状态转换的输入或动作
例如"启动按钮按下"、"停止信号接收"、"急停触发"等 - 转移(Transition):从一个状态到另一个状态的变化
通常由事件触发,可能伴随特定条件 - 动作(Action):状态转换时执行的操作
例如"进入运行状态时启动电机"、"进入急停状态时切断电源"
只要符合这四个概念就是状态机,最简单的就是权限管理的功能了,软件上有不同的账户,然后不同的账户有不同的权限功能(状态)。不同的权限对应的能执行的操作不同,比如管理员可以修改参数,操作员不可以(动作)。账户登录界面可以切换不同的账户登录(事件)。只有输入正确的密码才可以登录不同的账户(转移)。这个状态机完全可以使用if-else语句来进行判断实现,建立一个枚举来存储不同的账户类型,然后一个变量存储着当前的账户状态,登录时进行密码和账户名判断,如果正确切换不同的账户。如果是简单的状态机完全可以使用这种方法的,只有3-5个简单状态、状态转换逻辑非常直接、没有复杂的嵌套子状态。这个方法就是对应这类项目最好的解决方案。
除此之外的一些实现方式
实现方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
条件语句(if-else) | 简单直观 | 状态多时代码臃肿难维护 | 简单状态机(3-5个状态) |
状态模式 | 符合开闭原则,易于扩展 | 需要创建多个状态类 | 复杂状态机,需要长期维护 |
状态表驱动 | 数据驱动,修改灵活 | 初期设计复杂 | 状态转换规则频繁变化 |
专用框架 | 功能强大,支持复杂特性 | 学习成本高 | 企业级复杂系统 |
状态模式
//接口
interface 状态接口
要实现的操作1、2、3
//具体的状态
class 状态1:状态接口
操作实现
class 状态2:状态接口
操作实现...
//调度类、上下文类
class 控制
接口实例
当前状态
切换状态1
切换状态2...
状态模式的出现也是为了解耦,更容易添加新状态,在状态大于五个并且出现层次嵌套的时候可以使用状态模式来实现。
无论如何要遵循的设计模式其实只有一个,一切应尽可能简单,但不过分简单。没有复杂度就不要复杂解,不要为了设计模式而去设计模式,代码只需要易懂、易改、安全就可以了