先介绍下状态机,状态机一般由三部分组成:状态(State)、事件(Event)、动作(Action)。其中,事件也称为转移条件(Transition Condition)。事件 触发 状态的转移及动作的执行。不过,动作不是必须的,可能只转移状态,不执行任何动作。

状态模式通过将事件触发的状态转移和动作执行,拆分到不同的状态类中,来避免分支判断逻辑。下面展示“超级马里奥”小游戏的游戏状态之间的状态转换,


public interface IMario {State getName();void obtainMushRoom(MarioStateMachine stateMachine);void obtainCape(MarioStateMachine stateMachine);void obtainFireFlower(MarioStateMachine stateMachine);void meetMonster(MarioStateMachine stateMachine);
}public class SmallMario implements IMario {private static final SmallMario instance = new SmallMario();private SmallMario() {}public static SmallMario getInstance() {return instance;}@Overridepublic State getName() {return State.SMALL;}@Overridepublic void obtainMushRoom(MarioStateMachine stateMachine) {stateMachine.setCurrentState(SuperMario.getInstance());stateMachine.setScore(stateMachine.getScore() + 100);}@Overridepublic void obtainCape(MarioStateMachine stateMachine) {stateMachine.setCurrentState(CapeMario.getInstance());stateMachine.setScore(stateMachine.getScore() + 200);}@Overridepublic void obtainFireFlower(MarioStateMachine stateMachine) {stateMachine.setCurrentState(FireMario.getInstance());stateMachine.setScore(stateMachine.getScore() + 300);}@Overridepublic void meetMonster(MarioStateMachine stateMachine) {// do nothing...}
}// SuperMario、CapeMario、FireMario类...public class MarioStateMachine {private int score;private IMario currentState;public MarioStateMachine() {this.score = 0;this.currentState = SmallMario.getInstance();}// 具体方法实现
}

实际上,像游戏这种比较复杂的状态机,包含的状态比较多,优先推荐使用查表法(映射表,状态映射事件,可构造多维数组),而状态模式会引入非常多的状态类,反而会导致代码比较难维护。相反,像电商、外卖下但这种类型的状态机,它们的状态并不多,状态转移也比较简单,但事件触发执行的动作包含的业务逻辑可能会比较复杂,所以,更适合使用状态模式来实现。

【设计模式】状态模式(状态机)相关推荐

  1. c语言设计模式--状态模式(状态机)

    模式动机 状态模式(状态机)是嵌入式开发中最重要.最核心的设计模式之一,毫不夸张的说,是否熟练掌握状态模式,很大程度上直接决定了嵌入式工程师的代码掌控能力.在嵌入式开发里面,几乎80%以上的程序都有状 ...

  2. Java 有限状态机 (设计模式——状态模式)

    Java 有限状态机 (设计模式--状态模式) 编写代码的时候,有时会遇见较为复杂的swith...case...和if...else...语句.这一刻有时会想到状态机,用有限状态机替换swith.. ...

  3. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  4. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  5. 设计模式状态模式uml_UML的完整形式是什么?

    设计模式状态模式uml UML:统一建模语言 (UML: Unified Modeling Language) UML is an abbreviation of Unified Modeling L ...

  6. C++设计模式——状态模式

    C++设计模式--状态模式 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的.   1 2 3 4 5 6 7 8 9 10 ...

  7. C++设计模式——状态模式(state pattern)

    一.原理讲解 别名状态对象(object for state). 1.1意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 1.2应用场景 一个对象的行为取决于它的状态,并 ...

  8. 设计模式——状态模式详解

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  9. 设计模式 - 状态模式(状态机)

    有限状态机(英语:finite-state machine,缩写:FSM) 有限状态机又称有限状态自动机(英语:finite-state automation,缩写:FSA),简称状态机,是表示有限个 ...

  10. 设计模式-状态模式实现状态机

          1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的 ...

最新文章

  1. 【每日一算法】两个列表的最小索引总和
  2. HttpServletResponse 的 sendError( )方法以及常用的HttpServletResponse常量级错误代码
  3. php 下拉菜单 不提交 选中的值,在html中怎样可以做到下拉菜单提交后保留选中值不返回默认值...
  4. 判断上三角矩阵 (15 分)
  5. netty的channel介绍
  6. LCD驱动 15-1
  7. 使用xadmin更新数据时,报错expected string or bytes-like object
  8. 《C++面向对象高效编程(第2版)》——4.5 对象复制的语义
  9. OpenCV探索之路(十六):图像矫正技术深入探讨
  10. 游戏建模赏析:《魔兽世界》伊瑟拉图鉴
  11. mysql间隙锁_解决MySQL可重复读——详解间隙锁
  12. Python单例模式4种方式
  13. 磨洋工 warm-chair attrition
  14. 不能设置一个python sdk_【君奉天|开发日记】Python SDK换唤醒词及设置服务配置
  15. 【图像增强】Frangi滤波器血管图像增强【含Matlab源码 2108期】
  16. Android肝帝战纪之网络请求框架封装(Retrofit的封装)
  17. EBS 常用模块到XLA的关联字段追溯
  18. 大数据和云计算发展前景怎样?
  19. Linux SSH命令大全
  20. html2canvas.js下载地址

热门文章

  1. 利用SVM小样本机械故障诊断(MATLAB代码)
  2. 吴恩达机器学习(十)特征和多项式回归
  3. qq音乐播放器2014最新版 v10.21.4270 官方版
  4. c++ WinExec 打开外部程序有问题的解决办法
  5. 数学建模用python分析gdp_【志领学院】HiMCM数学建模 商业事件建模分析——活动回顾...
  6. ZUI 动态加载树形菜单+动态打开Tab
  7. 走进中国移动,揭秘大数据应急救灾背后的故事
  8. 分布式基础-拜占庭将军问题
  9. 如何使用计算机制作表格,怎么在电脑上制作表格? 教你使用word和Excel做表格
  10. Vmware安装openfiler