策略模式(Strategy)与状态模式(State)到底有什么区别?

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

  1. 策略模式与状态模式有什么区别呢?
    策略模式的意图:定义一系列算法,把它们一个个封装起来,并且相互之间可以替换。
    状态模式的意图:允许一个对象在其内部状态改变的情况下,改变其行为。
    这两个意图从表面上看好像没什么关系,其实实现过的小伙伴们都知道,它们之间还是很相似的。它们都有一个Context,并且都是Context加载不同的类,并且调用时也都是通过Context调用。并且以上两个意图只是描述了其形式,潜在的目的并没有指出。
    对于策略模式,为什么要封装成多个可以相互替换的算法对象呢?就是为了统一调用,即实现接口回调。这样,算法有了,统一的调用框架有了。在使用时只要根据需求,填充需要的算法对象就可以。
    对于状态模式,为什么能够在对象内部状态改变时改变其行为呢?是因为在状态改变时,加载了不同的对象,不同的对象当然会有不同的行为了。前提是什么呢?承载状态的框架是稳定的。
    策略模式和状态模式都提到了框架,为什么呢?其实他们最主要的意图都是将变化的部分提取出来,封装成各种对象,然后将不变的部分固定成框架,这样形成了一种可插拔的标准模式,使用起来就方便了,而且解耦合,易于扩展。
    相同的地方:策略模式通过改变其算法对象,做出不同的行为;状态模式根据状态改变,做出不同的行为。两者都是通过元素的改变,做出不同的行为。
    不同的地方:那么区别是什么呢?策略模式需要根据需求来选择实现的策略,而状态模式是根据状态变化而自动改变行为。即策略模式的算法需要被动的被设置,而状态模式的状态是根据条件自动转换的。一个改变是来自于外部选择,另一个的改变是来自于内部的自动判断。
    从大的思想上来说,都是取其静,外挂其动。