为了给用户提供更好的体验方式,多级联动,多种选择方式,半智能化的容错能力等是咱们采用的手段,同时这对软件的开发带来了更多的复杂性。咱们须要考虑在各类不一样状态下,按钮的功能,以及转换。ide
在我作过的若干项目中,牵扯这一问题的地方都是很是容易出bug的。界面越简化,越智能,错误率越高。屡次尝试使用State模式简化问题,但效果并不明显。函数
仔细分析一下,发现State模式,解决的就是不一样状态下,行为不一样的问题。但对于状态的转换和迁移,State模式并无给出解决办法。这就致使有些时候引入State模式会带来更大的复杂性。例如:有n种可能改变状态的外部事件,m种状态,在State的模式中,状态的转移被定义在Context类中,这就致使在Context类中,须要对每种外部事件,遍历全部状态,决定下一状态。从而在Context类中最多须要了n*m次IF语句。致使了可读性的迅速降低。设计
另一种更糟糕的设计是,让State类来处理外部事件,也就是说对事件的响应放到状态类中去,从OO分析的角度来看,这样也无可厚非,对同一外部事件的状态迁移也能够算做行为不一样的一种方式。然而,当状态转移行为比较复杂时,整个事情就变成了一种灾难。当状态通过屡次转换,每次你都要找到对应的状态类,来查看下一次状态是什么。换句话说,咱们必须查看完全部的实际状态类,才能获得一个完整的状态迁移状况。对象
状态迁移表很好的解决了状态的迁移的问题。整个状态转换一目了然。结合State模式,能够较为完美的解决这一问题。事件
惋惜的是JAVA并不支持函数对象,不然代码能够更加简化了明了。开发
PS:这种解决办法在Python中常常使用,多学几种语言,扩展一下本身的视野仍是颇有必要的it