oop - 状态模式和策略模式的区别

标签 oop design-patterns strategy-pattern state-pattern

查看 GoF 模式,我发现状态和策略模式之间的相似之处相当惊人。 两者都交换多态类来修改行为。还有人发现同样的情况吗?

具体的区别是什么?

最佳答案

状态模式和策略模式在某种意义上是相似的,它们都将行为封装在单独的对象中,并使用组合委托(delegate)给组合对象来实现行为,并且它们都提供了通过更改运行时组合对象。但有一些关键的区别:

  1. 在状态模式中,客户端对状态对象一无所知。状态变化对客户端来说是透明的。客户端只需调用上下文上的方法,上下文监督其自身的状态。由于客户端不知道状态更改,因此在客户端看来,每次由于状态更改而导致行为发生更改时,上下文似乎都是从不同的类实例化的。该对象似乎会按照模式的官方定义来更改其类。该模式是围绕一系列明确定义的状态转换构建的。改变状态是模式存在的关键。

  2. 尽管策略模式通过动态更改组合策略对象提供了更改行为的灵 active ,但大多数情况下已经为每个上下文设置了适当的策略对象。即,即使该模式提供了一种动态更改组合策略对象的方法,但也没有太多需要。即使必须这样做,也是由客户来进行更改的。客户端将调用上下文的 setter 方法并传递新的策略对象。因此,行为变化对客户端来说并不透明,而是由客户端发起和控制。该模式不鼓励像状态模式那样进行一系列明确定义的行为更改。客户端了解策略对象,并且通常会在创建策略对象时在上下文中设置适当的策略对象。客户端控制上下文使用什么策略对象,但在状态模式中,客户端对上下文使用的状态对象一无所知

    有关更多信息,请参阅以下链接 http://myrandomsparks.blogspot.in/2012/05/strategy-vs-state-pattern.html

关于oop - 状态模式和策略模式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18117462/

相关文章:

java - 为子类设置父类(super class)属性

sql - 同步客户端-服务器数据库

ruby-on-rails - 这种客户端-服务器设计有意义吗?实用吗?

c# - 桥梁模式与策略模式

c#-4.0 - 策略模式还是界面?

java - 了解如何解耦

java - 如何在 OOP 中实现图形层次结构

java - 从父类方法调用子类方法

java - 将 if-else 修改为策略模式

matlab - 在matlab中使用FFT去除图像中的图案和噪声