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

设计模式 状态机

前言

本文梳理状态机概念,在实操中状态机和状态模式类似,只是被封装起来,可以很方便的实现状态初始化和状态转换。

概念

有限状态机(finite-state machine)又称有限状态自动机(英语:finite-state automaton,),简称状态机。是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。
即状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。

状态机四大术语

状态机中有几个术语:state(状态) 、transition(转移) 、action(动作) 、transition condition(转移条件) 。

  • state(状态) :
    将一个系统离散化,可以得到很多种状态,当然这些状态是有限的。
    例如:门禁闸机可以划分为开启状态、关闭状态;电扇可以划分为关、一档、二档、三档等状态。
  • transition(转移) :
    一个状态接收一个输入执行了某些动作到达了另外一个状态的过程就是一个transition(转移)。
    定义transition(转移)就是在定义状态机的转移流程。
  • transition condition(转移条件) :
    也叫做Event(事件),在某一状态下,只有达到了transition condition(转移条件),才会按照状态机的转移流程转移到下一状态,并执行相应的动作。
  • action(动作):
    在状态机的运转过程中会有很多种动作。
    如:进入动作(entry action)[在进入状态时进行]、退出动作(exit action)[在退出状态时进行]、转移动作[在进行特定转移时进行]。

状态机分类

状态机可以被分成两大类:接受器Acceptors 和 变换器Transducers。

接受器Acceptors

acceptors(接收器) 是指产生一个二值的输出,指示接收的输入是否能被接受。
acceptors(接收器)的每一种状态都是接受或不接受的。如果一组所有的输入都被接受并且当前的状态是接受状态,那么这一组输入就是可接受的。
有限状态机的acceptors(接收器)这一类在正则引擎的实现中用得非常多。

image.png

变换器Transducers

transducers(转换器) 是根据当前的状态和(或)给定的输入产生输出,输出的同时可能也伴随着状态的转移(不是必须)。
转换器型有限状态机可以分为两种子类型,moore machine (摩尔型有限状态机)和mealy machine (米利型有限状态机) 。

moore machine摩尔型有限状态机

Moore型状态机的输出只与当前状态有关,与当前输入无关。
输出会在一个完整的时钟周期内保持稳定,即使此时输入信号有变化,输出也不会变化。输入对输出的影响要到下一个时钟周期才能反映出来。这也是 Moore 型状态机的一个重要特点:输入与输出是隔离开来的。
image.png

mealy machine 米利型有限状态机

Mealy型状态机的输出,不仅与当前状态有关,还取决于当前的输入信号。
Mealy 型状态机的输出是在输入信号变化以后立刻发生变化,且输入变化可能出现在任何状态的时钟周期内。因此,同种逻辑下,Mealy 型状态机输出对输入的响应会比 Moore 型状态机早一个时钟周期。
Mealy有限状态机的输出直接受输入信号的当前值影响,而输入信号可能在一个时钟周期内任意时刻变化,这使得Mealy有限状态机对输入的响应发生在当前时钟周期,比Moore有限状态机对输入信号的响应要早一个周期。因此,输入信号的噪声可能影响在输出的信号。
image.png

状态机表示方式

状态机有State/Event table(状态转移表)、UML state machines、SDL state machines等表示方法,这里主要介绍状态转移表,这种表示方法用的最多,也比较方便。
image.png

状态机实践

StateMachine
一个swift和kotlin写的状态机SDK,只有一个文件,代码清晰易懂;
官方示例对物理的三大状态进行封装和转换,一看就会。
image.png

参考:
Verilog 状态机
什么是状态机
什么是状态机

http://www.lryc.cn/news/13339.html

相关文章:

  • React源码分析(二)渲染机制
  • Object.defineProperty 和 Proxy 的区别
  • Python基础4——面向对象
  • Hive 核心知识点灵魂 16 问
  • 聊聊探索式测试与敏捷实践
  • 社区宠物诊所管理系统
  • Vue项目创建首页发送axios请求
  • Nginx
  • 2049. 统计最高分的节点数目
  • Docker 架构简介
  • 玄子Share-BCSP助学手册-JAVA开发
  • 利用React实现多个场景下的鼠标跟随框提示框
  • 【安全知识】——如何绕过cdn获取真实ip
  • JavaScript内存泄露和垃圾回收机制
  • Kubernetes02:知识图谱
  • nginx-服务器banner泄漏风险
  • GCC 同名符号冲突解决办法
  • 下一代视频编码技术2023
  • 最新最全中小微企业研究数据:海量创业公司信息与获取投资信息(1985-2021年)
  • springboot数据源浅析
  • 2022黑马Redis跟学笔记.实战篇(七)
  • QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等
  • 硬件学习 软件Cadence day04 PCB 封装绘制
  • 【Java】yield()和join()区别
  • 【MySQL】Java连接MySQL数据库(封装版只需会MySQL)
  • 【java基础】运算符
  • 带噪学习-概述
  • Scratch少儿编程案例-多彩打地鼠
  • 为什么拔掉计算机网线还能ping通127.0.0.1?
  • Android kotlin 内、外部存储根目录及测试(可以实现仿微信未读消息数提示数字)