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

状态模式详解

概述

结构设计类似责任链模式,但是在各个状态进行遍历的过程中,更注重的是条件的判断,只有符合条件的状态才能正常匹配进行处理。条件不成功的会立即切换到下一个状态。

有限状态机

状态机一般指的是有限状态机(FSM:finite-state machine),又称为优先自动状态机(FSA:finite-state automaton)。

  • 状态(State)

    状态机的有限个状态,例如:门可以分为开启、关闭两种状态。

  • 转换条件/事件(Transition Condition / Event)

    触发状态机的事件。只有收到相应的事件触发相应条件时候,状态机才会进行状态的转换。

  • 转换(Transition)

    记录状态机进行状态转换的多个过程(指定事件可以转换到指定状态的关系,可以是多个关系,表示当前状态可以在触发不同事件后,可以转换到多个不同的其他状态),用来在事件触发时候进行状态转换。

  • 动作(Action)

    在进行状态切换完成后,要执行的动作。

状态机分类

根据状态机的写法,可以分为三种(主要应用在硬件电路):

  • 一段式:一段式状态机的缺点就是许多种逻辑糅合在一起,不易后期的维护。
  • 两段式:
  • 三段式:

根据状态机的输出是否与输入有关系,可以分为两种:

  • Mealy 状态机(不仅与当前状态有关,还取决于当前的输入事件)
  • Moore 状态机(只与当前状态有关,与当前输入无关)

类图

Context
- IState state;
+setState(IState)
+rqeust()
«interface»
IState
+void handle(Context)
StopState
+void handle(Context)
RunningState
+void handle(Context)

注意:类图种状态的公共接口只有一个 handle(Context),实际使用时候状态一般都不止一个接口,可能有若干个

关键代码

class Context {private $state;public function __construct() {$this->state = new StopState();}public function setState(IState $state) {$this->state = state;}public function request() {$this->state->handle($this);}
}interface IState {public function handle(Context $context);
}class StopState implements IState {public function handle(Context $context) {// 与其他状态条件不同.if (...) {echo "stop state ...". PHP_EOL;    } else {$context->setSate(new RunningState());$context->request();}}
}class RunningState implements IState {public function handle(Context $context) {// 与其他状态不同的条件if (...) {echo "stop state ...". PHP_EOL;    } else {$context->setSate(new RunningState());$context->request();}}
}
// 客户端代码.
$context = new Context();
$context->request();
http://www.lryc.cn/news/573079.html

相关文章:

  • Filecoin系列 - IPLD 技术分析
  • verilog HDLBits刷题“Module shift8”--模块 shift8---模块和向量
  • Python 的内置函数 hasattr
  • 中国设计 全球审美 | 安贝斯新产品发布会:以东方美学开辟控制台仿生智造新纪元
  • 【Koa系列】10min快速入门Koa
  • 蓝牙 5.0 新特性全解析:传输距离与速度提升的底层逻辑(面试宝典版)
  • 项目开发中途遇到困难的解决方案
  • 深入解析BERT:语言分类任务的革命性引擎
  • 创业知识概论
  • tkinter Entry(输入框)组件学习指南
  • 加密货币:比特币
  • 5.3 LED字符设备驱动
  • HarmonyOS 6 + 盘古大模型5.5
  • 【Python】Excel表格操作:ISBN转条形码
  • 西门子S7通信协议抓包分析应用
  • 【入门级-基础知识与编程环境:NOI以及相关活动的历史】
  • AI 产品的“嵌点”(Embedded Touchpoints)
  • python打卡day37
  • 智能体互联网新闻速递及深度分析【250620】
  • STM32[笔记]--开发环境的安装
  • 大数据Hadoop集群搭建
  • Linux (2)
  • Java常见八股-(6.算法+实施篇)
  • 知识蒸馏(Knowledge Distillation, KD)
  • gitea本地部署代码托管后仓库的新建与使用(配置好ssh密钥后仍然无法正常克隆仓库是什么原因)
  • 李宏毅 《生成式人工智能导论》| 第6讲-第8讲:大语言模型修炼史
  • 【大模型学习】项目练习:知乎文本生成器
  • IPv6 | 地址解析 / 地址管理 / 邻居发现协议(NDP)/ 无状态自动配置(SLAAC)
  • 简单的 ​Flask​ 后端应用
  • FPGA基础 -- Verilog 的属性(Attributes)