看看GoF模式,我发现State和Stategy模式之间的相似性相当惊人。 两者都交换出多态类来修改行为。其他人发现了同样的事情吗?
有什么确切的区别?
答案 0 :(得分:7)
状态和策略模式在某种意义上是相似的,它们都将行为封装在单独的对象中,并使用组合来委托组合对象来实现行为,并且它们都提供了通过更改动态来动态更改行为的灵活性。在运行时组合对象。但是有一些关键的区别:
在状态模式中,客户端对状态对象一无所知。状态变化对客户端透明地发生。客户端只调用上下文中的方法,上下文监视其自身的状态。因为客户端不知道状态更改,所以客户端看起来好像每次由于状态更改而导致行为发生更改时从不同的类实例化上下文。该对象似乎将其类更改为模式状态的官方定义。该模式围绕明确定义的一系列状态转换构建。改变状态是模式存在的关键。
即使策略模式通过动态更改组合策略对象提供了更改行为的灵活性,但大多数情况下已经为每个上下文设置了适当的策略对象。即使模式提供了一种动态改变组合策略对象的方法,也不需要它。即使必须这样做,也是客户做出改变。客户端将在上下文中调用setter方法并传递新的策略对象。因此,行为更改对客户端不透明,并由客户端启动和控制。该模式不会鼓励一系列明确定义的行为更改,例如状态模式。客户端知道策略对象,并且通常在创建它时在上下文中设置适当的策略对象。客户端控制上下文使用的策略对象,但在状态模式中,客户端对上下文使用的状态对象一无所知
有关其他信息,请参阅以下链接http://myrandomsparks.blogspot.in/2012/05/strategy-vs-state-pattern.html
答案 1 :(得分:0)
策略模式决定“如何”执行某些操作,状态模式决定“何时”执行它们。
通过使用状态模式,状态保持(上下文)类不再了解它是什么状态或类型以及可用的状态或类型。这意味着该类遵循开放式封闭式设计原则(OCP):该类因状态/类型的变化而关闭,但状态/类型对扩展是开放的。
通过使用策略模式,算法使用(上下文)类从如何执行某个任务( - “算法”)的知识中解脱出来。这种情况也会导致对OCP的遵守;该类因关于如何执行此任务的更改而关闭,但该设计对于添加其他算法以解决此任务非常开放