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

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

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

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

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

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

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