- 策略模式封装的是不同的算法,算法之间没有交互、以达到算法可以自由切换的目的;
- 状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的。这两个模式虽然都有变换的行为,但是两者的目标却是不同的。
最佳实践
环境角色的职责不同
两者都有一个叫做Context环境角色的类, 策略模式的环境角色只是一个委托作用,负责算法的替换;而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换的任务。
解决问题的重点不同
策略模式旨在解决内部算法如何改变的问题,也就是将内部算法的改变对外界的影响降低到最小程度,它保证算法可以自由切换;而状态模式旨在解决内在状态的改变而引起行为改变的问题,它的出发点是事物的状态,封装状态而暴露行为,一个对象的状态改变,从外界看就好像是行为改变。
解决问题的方法不同
策略模式只是确保算法可以自由切换,但是什么时候用什么算法它决定不了;而状态模式对外暴露的是行为,状态的变化一般由环境角色和具体状态共同完成的,也就是说状态模式封装了状态的变化而暴露了不同的行为或行为结果。
应用场景不同
策略模式是一系列平行的、可相互替换的算法封装后的结构。状态模式则要求有一系列状态发生变化的场景,它要求的是有状态且有行为的场景,也就是一个对象必须具有二维描述才能采用状态模式,如果只有状态而没有行为,则状态的变化就失去了意义。
复杂度不同
通常策略模式结构简单,扩展比较容易,而且代码也容易阅读。而状态模式通常比较复杂,因为它要从两个角色看到一个对象状态和行为的改变,也就是说它封装的是变化,要知道变化是无穷尽的,因此相对来说状态模式通常都比较复杂,涉及面很多,虽然也很容易扩展,但是一般不会进行大规模的扩展和修正。
网友评论