为了给用户提供更好的体验方式,多级联动,多种选择方式,半智能化的容错能力等是我们采用的手段,同时这对软件的开发带来了更多的复杂性。我们需要考虑在各种不同状态下,按钮的功能,以及转换。

在我做过的若干项目中,牵扯这一问题的地方都是非常容易出bug的。界面越简化,越智能,错误率越高。多次尝试使用State模式简化问题,但效果并不明显。

仔细分析一下,发现State模式,解决的就是不同状态下,行为不同的问题。但对于状态的转换和迁移,State模式并没有给出解决办法。这就导致有些时候引入State模式会带来更大的复杂性。例如:有n种可能改变状态的外部事件,m种状态,在State的模式中,状态的转移被定义在Context类中,这就导致在Context类中,需要对每种外部事件,遍历所有状态,决定下一状态。从而在Context类中最多需要了n*m次IF语句。导致了可读性的迅速下降。

另外一种更糟糕的设计是,让State类来处理外部事件,也就是说对事件的响应放到状态类中去,从OO分析的角度来看,这样也无可厚非,对同一外部事件的状态迁移也可以算作行为不同的一种方式。然而,当状态转移行为比较复杂时,整个事情就变成了一种灾难。当状态经过多次转换,每次你都要找到对应的状态类,来查看下一次状态是什么。换句话说,我们必须查看完所有的实际状态类,才能得到一个完整的状态迁移情况。

状态迁移表很好的解决了状态的迁移的问题。整个状态转换一目了然。结合State模式,可以较为完美的解决这一问题。

可惜的是JAVA并不支持函数对象,否则代码可以更加简化了明了。

PS:这种解决办法在Python中经常使用,多学几种语言,扩展一下自己的视野还是很有必要的

转载于:https://blog.51cto.com/element1999/284991

状态转移表+State模式相关推荐

  1. 为什么只有状态转移算法才是真正意义上的智能优化算法,其它的都是“假冒伪劣”?

    0 旁白 长期以来,"论文为王"的观念被推崇至上,没有论文就没有发言权,发表了大量学术论文才能高谈阔论.坐而论道,以至于出现"大家都忙着写论文,没有时间搞科研" ...

  2. 根据状态转移表实现时序电路

    根据状态转移表实现时序电路 某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路 电路的接口如下图所示 A表示输入,Y 表示输出 理解状态转移表,画成状态转移图 `timescal ...

  3. REST(Representational State Transfer表述性状态转移)

    http://zh.wikipedia.org/zh-cn/REST REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降 ...

  4. java state用法_Java状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elsei ...

  5. 微服务——REST(Representational State Transfer,表述性状态转移)

    面试造飞机系列:看架构师如何设计微服务接口 REST(Representational State Transfer,表述性状态转移) 是一种软件架构风格.REST提出了一组架构约束条件和原则,任何满 ...

  6. 5.8 设计模式之State(状态)—对象行为型模式

    5.8 State(状态)-对象行为型模式 参考文章 意图 状态模式是一种行为设计模式, 改变一个对象的内部状态进而改变其行为. 问题及情景 状态模式与有限状态机的概念紧密相关. 其主要思想是程序在任 ...

  7. C++之状态(State)模式

    0. 简介 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样.这其实就有点类似算法中的有限状态机的形式. 其主要思想是程序在任意时刻仅可 ...

  8. 设计模式--状态(State)模式

    模式定义 允许一个对象在其内部状态改变时改变它的行为,从而使对象看起来似乎修改了其行为 类图 要点总结 State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时, ...

  9. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

最新文章

  1. DataGridView 分页显示
  2. Eclipse下Tomcat插件的安装
  3. 学习python用哪个app-Python和R:学哪个好?
  4. 动态asp网页批量生成静态html网页问题
  5. 安装QT5后运行提示libHelp.so无法加载
  6. 【机器学习】PyCaret!又一个神仙的自动机器学习库!
  7. 彻底删除 XP 自带的 Windows Messenger方法
  8. 这一次,用数据解读玩家行为,用实力拿下预测大奖!
  9. Unity中传入任意数,转换成分,秒,并进行倒计时换算..(两种方式)
  10. 机器学习算法概述:随机森林逻辑回归
  11. JAVA学习-JAVA数组的使用示例
  12. django学习笔记:AdminSite界面配置
  13. 英文书: Python 网络编程基础手册
  14. Codeforces Round 1 - 10总结 【@Abandon】
  15. Java二级练习试题一
  16. 查看极域电子教室的密码
  17. JavaEE三大框架ssh
  18. python论文排版格式_Latex论文排版工具使用教程
  19. 忘记vmware虚拟机系统登入密码如何破解,破解vmware登录密码。
  20. 搜索关键词优化 助力全网霸屏营销

热门文章

  1. mysql 备份如何使用_如何使用命令来备份和还原MySQL数据库
  2. Python编程基础18:运算符重载
  3. Python编程基础10:列表
  4. Java讲课笔记24:字节流
  5. php 调用父类变量,PHP-通过实例化父类访问常量
  6. 2017.10.19 大陆争霸 思考记录
  7. 2018怎么更换图框_2018 乐博睿 全年回顾
  8. 三维旋转四元数系列(4.四元数三维旋转表达)
  9. eclipse--基本配置
  10. 自定义刻度_想为 Apple Watch 打造自定义表盘,试试这款 App