suse-lj的个人空间 https://bbs.21ic.com/?676682 [收藏] [复制] [RSS]

日志

状态机设计模式

已有 219 次阅读2019-10-20 15:40 |系统分类:兴趣爱好

背景  
在需求开发的过程中,经常会遇到根据不同的情况作出不同的处理。最直接的就是if...else...。当场景特别复杂时,判断if就有些
力不从心了。加一个场景需要修改大量的代码,这不是一个很好的做法。程序的扩展性特别薄弱。
状态模式
    状态模式就是用来解决大量不同场景不同行为的模式。状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎
修改了它的类。
示例
日常生活中,我们遇到的最多的带有状态的对象,比如电梯:
  • 电梯包含了四种状态:关门,开门,运动,停止
  • 状态之间会进行转换:关门(默认)->开门->关门->运动->停止->开门->关门

所以,在代码实现时,就出现了一个[状态(枚举)][电梯(类)],其中[电梯]包含了四种状态的处理逻辑,以及提供了一个

[去某一层]的方法。状态之间的转换直接写在状态的处理逻辑中(例如开门状态的处理,就是转换到关门状态)。

如果我在电梯的gotoFloor函数中,使用
if (当前为关门状态) { 关门状态的处理;下一个状态; } else if (当前为开门状态) {开门状态的处理;下一个状态;} else if (当前为运行状态) {运行状态的处理;下一个状态;} ...
这样的方式来进行状态的处理与转换,这也是状态机的一种实现方式。

我的理解就是:状态机就是控制物体状态转换的逻辑,也就是上面这一堆if () {} else if () {} ...。

为什么书本上对状态机描述得很复杂呢?因为状态机本身就是一套状态转换逻辑,只不过它是为了处理更复杂的物体的状态转换而编写的。

所以状态机的运用,在于怎样合理、高效的实现状态的转换,把原本需要使用大量 if .. else if ..来处理的转换逻辑描述的更清晰。

总结:
1.状态机,就是一套用于控制物体状态转换的逻辑。实现状态机控制的首要条件就是清楚的划分物体的状态。
2.状态机有各种各样的实现方式,实现时需要考虑到子新增状态。

这样简单的逻辑,我们可以不假思索得很快的在一份代码中完成。只要使用switch语法,对对象当前的状态做判断,然后在给各个分支中

写上各自的逻辑。但是,如果你需要增加一个中间状态,或者修改某一个分支的逻辑时,你将不得不修改这个类的代码,增加case分支,

修改逻辑。这违反了软件设计中的“开放封闭原则”。为此,我们将状态模式的概念付诸实施,将与指定状态有关的逻辑操作分别写在对应

的可代表状态的类里。

使用于焊接电源的状态机设计模式:

对于焊接电源来说,有开机状态、电源硬件自检状态、待机状态、焊接状态、报警状态。


  


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)