今天看了一下阿里的 Java 的开发手册,看到了个有意思的问题,代码里的多层嵌套的问题,文档中提供的解决方案是用 卫语句 、 策略模式 、 状态模式 这三种方案解决,看了一下具体的实现:
卫语句是指的将多层嵌套拆分成不同的方法的一种形式。但是卫语句并不能解决现在提到的这个问题,只是可以解决多层嵌套本身不易理解的情况。
if (condition)
return obj;
策略模式的本质是分离算法,在具体的上下文中选择实现。
比如我们有三个同样的内容,在不同的情况下进行触发,如果每种情况的具体操作不同,但是比较类似,比如两数相加、两数相减,这就可以实现为策略模式,当我们希望相加时,把策略的对象传给调用的方法,就能执行实现中的加的方法了。
状态模式的本身是设置状态,当状态改变时,改变相应的实现。
比如我有一个画圆的操作,从 x 轴开始顺时针画圆,当 y 轴为 0 的时候, x 为零,y 为负值的时候,和 x 为零,y 为正值的时候,是四个不同的画笔完成的,而每次绘制,都是在四个条件中进行自动切换,而不是我们希望用什么状态去切换。
状态模式和策略模式的 UML 图是一样的,但是意图却完全不一样,策略模式是让用户指定更换的策略算法,而状态模式是状态在满足一定条件下的自动更换,用户无法指定状态,最多只能设置初始状态。
所以状态模式更像是触发模式,当其一个状态改变的时候,其执行的方法也就改变了,而策略模式是主动去修改当前的策略,而其中的算法或者方法是可以替代的,比如计算中的四则运算,可以当成同一个类别,但是当意图改变的时候,调用的方法也就改变了。也就是策略模式,而状态模式更像是一个选择,比如递减的数列,当值递减到某一个范围之后,就不再有递减的状态了。
使用的话,状态模式更适合替代 while 循环,当循环结束时,状态也就要发生改变。而且策略模式更适合替代 if-else 条件,条件的不同,也就代码了使用不同的策略执行。作。