设计模式 状态机

news2024/11/15 10:21:48

前言

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

概念

有限状态机(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.coloradmin.cn/o/357543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThreadLocal知识点总结

什么是ThreadLocal?它的作用是什么? ThreadLocal是线程Thread中属性threadLocals的管理者。 ThreadLocal是Java中lang包下的一个类,可以用于在多线程环境中为每个线程维护独立的变量副本。它的作用是让每个线程都拥有自己的数据副本&#xff…

Java面向对象的特性:封装,继承与多态

Java面向对象的特性 在学习Java的过程是必须要知道的Java三大特性:封装、继承、多态。如果要分为四类的话,加上抽象特性。 封装 1.封装概述 是面向对像三大特征之一(封装,继承,多态) 是面向对象编程语言对客…

语音增强学习路线图Roadmap

语音增强算是比较难的研究领域,从入门到精通有很多台阶,本文介绍一些有价值的书籍,值得反复阅读。主要分为基础类和进阶类书籍,大多都是理论和实践相结合的书籍,编程实践是抓手,让知识和基础理论变扎实。基础书籍《信号…

RT-Thread初识学习-01

1. RT-Thread 简介 1.1 RT-Thread 是什么 据不完全统计,世界有成千上万个 RTOS(Real-time operating system,实时操作系统),RT-Thread 就是其中一个优秀的作品。 RT-Thread 内核的第一个版本是熊谱翔先生在 2006 年…

分布式-分布式存储笔记

读写分离 什么时候需要读写分离 互联网大部分业务场景都是读多写少的,读和写的请求对比可能差了不止一个数量级。为了不让数据库的读成为业务瓶颈,同时也为了保证写库的成功率,一般会采用读写分离的技术来保证。 读写分离的实现是把访问的压…

LeetCode-384-打乱数组

1、列表随机 为了能够初始化数组,我们使用nums保存当前的数组,利用orignal保存初始化数组。为了实现等可能随机打乱,考虑到随机数本质上是基于随机数种子的伪随机,我们采用如下的方式实现等可能随机:我们将所有元素压…

MySQL备份恢复(十二)

文章目录1. MySQL数据损坏类型1.1 物理损坏1.2 逻辑损坏2. DBA运维人员备份/恢复职责2.1 设计备份/容灾策略2.1.1 备份策略2.1.2 容灾策略2.2 定期的备份/容灾检查2.3 定期的故障恢复演练2.4 数据损坏时的快速准确恢复2.5 数据迁移工作3. MySQL常用备份工具3.1 逻辑备份方式3.2…

【scl】博图程序的导入和导出

导入或者导出博图文件的方法(也叫移植文件) 目录 前言 ​编辑 ​编辑 前言 本篇文章主要写一下关于博图文件的导入和导出,具体要怎么样才能将写好的程序或者块移植到其他地方,下面我们一起来看! 一、程序块的导入和导…

[软件工程导论(第六版)]第4章 形式化说明技术(课后习题详解)

文章目录1. 举例对比形式化方法和欠形式化方法的优缺点。2. 在什么情况下应该使用形式化说明技术?使用形式化说明技术时应遵守哪些准则?3. 一个浮点二进制数的构成是:一个可选的符号(+或-)&…

Seata分布式事务框架-AT模式与TCC模式介绍

Seata分布式事务框架-AT模式介绍 Seata AT事务方案 Seata 的 AT 模式(Automatic Transaction)是一种无侵入的分布式事务解决方案。下面结合具体业务场景来分析其执行的原理。 业务场景 订单系统 当用户下订单时,执行以下三步流程&#x…

【NLP开发】Python实现聊天机器人(Selenium、七嘴八舌)

🍺NLP开发系列相关文章编写如下🍺:1🎈【NLP开发】Python实现词云图🎈2🎈【NLP开发】Python实现图片文字识别🎈3🎈【NLP开发】Python实现中文、英文分词🎈4🎈【…

XSS注入进阶练习篇(二)DOM型XSS注入深入

DOM型XSS注入深入1. SVG 劫持JS执行1.1 DOM树的概念与构建过程1.1.1 什么是DOM树?1.1.2 DOM树的构建过程1.2 探究img失败的原因1.3 svg标签劫持innerhtml2. details标签 特定条件下劫持JS执行2.1 事件触发流程2.2 实例3.DOM clobbering 绕过3.1 什么是DOM clobberin…

Redis内存回收

Redis 内存回收 Redis之所以性能很强&#xff0c;最主要的原因是基于内存存储&#xff0c;然而单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能 可以通过修改配置文件来设置Redis的最大内存 maxmemory <bytes>当内存达到上限时&#xff0c;就…

营销狂人杜国楹的两大顶级思维

“营销狂人”小罐茶 杜国楹两大顶级思维 1.一定要有【参照物思维】 2.一定要有【终局思维】 趣讲大白话&#xff1a;大牛的思考就是不同 *********** 杜国楹对茶行业思考 1.参照咖啡、酒的发展路径 2.中国茶工业化,品牌化是唯一壮大之路 3.龙头企业必须全品 没有参照物思维就没…

Python将内容写入文件的方法总结。

使用Python写入文件是我们coder的日常&#xff0c;本篇带你详细看一下python将内容写入文件的方法以及细节。主要包括write()方法、writelines() 方法、print() 函数、使用 csv 模块、使用 json 模块。 目录 一、write()方法 二、writelines() 方法 三、print() 函数 四、使…

【Java】中的各种锁

Java提供了种类丰富的锁&#xff0c;每种锁因其特性的不同&#xff0c;在适当的场景下能够展现出非常高的效率。 一、Java锁是什么&#xff1f;为什么要用Java锁&#xff1f; 在并发编程中&#xff0c;经常遇到多个线程访问同一个共享资源 &#xff0c;这时候作为开发者必须考…

【汇编】一、环境搭建(一只 Assember 的成长史)

嗨~你好呀&#xff01; 我是一名初二学生&#xff0c;热爱计算机&#xff0c;码龄两年。最近开始学习汇编&#xff0c;希望通过 Blog 的形式记录下自己的学习过程&#xff0c;也和更多人分享。 这篇文章主要讲述汇编环境的搭建过程。 话不多说~我们开始吧&#xff01; 系统环…

Ubuntu下安装 ntfs-3g

目录1.FAT32、NTFS和exFAT2.ubuntu 安装 ntfs-3g2.1 直接安装2.2 源码安装1.FAT32、NTFS和exFAT U盘在格式化的时候都会有三种格式分别是FAT32、NTFS和exFAT。 FAT32格式   FAT32格式硬盘分区的最大容量为2TB&#xff0c;虽然U盘做不到&#xff0c;但是现在1xTB硬盘都有了&…

实现8086虚拟机(三)——指令解码

文章目录中间指令格式解码模块的实现编译器将汇编语句翻译成机器指令&#xff0c;而虚拟机做的工作正好相反&#xff0c;就是将机器指令解码成可以识别的中间形式&#xff0c;然后执行。为什么要这么做&#xff1f;拿 mov 指令举例&#xff0c;看下它的机器指令的格式&#xff…

手动创建 vue2 ssr 开发环境

本文和个人博客同步发表 更多优质文章查看个人博客 前言 手动搭建 vue ssr 一直是一些前端开发者的噩梦&#xff0c;因为其中牵扯到很多依赖包之间的配置以及webpack在node中的使用。就拿webpack配置来说&#xff0c;很多前端开发者还是喜欢用webpack-cli脚手架搭建项目。导致…