JavaRush /Java 博客 /Random-ZH /Java 中状态模式和策略模式的区别
0xFF
第 9 级
Донецк

Java 中状态模式和策略模式的区别

已在 Random-ZH 群组中发布
为了在核心 Java 应用程序中正确使用状态策略模式,Java 程序员清楚地理解它们之间的区别非常重要。尽管状态和策略这两种模式具有相似的结构,并且都基于开放/封闭原则,代表SOLID 原则中的“O”,但它们的意图完全不同。 Java中的策略Java 中状态模式和策略模式的区别 - 1模式用于封装相关的算法集,为客户端提供执行灵活性。客户端可以在运行时选择任何算法,而无需更改使用. 策略模式的一些流行示例是编写使用算法的代码,例如加密、压缩或排序。另一方面,状态模式允许对象在不同状态下表现不同。因为在现实世界中一个对象往往是有状态的,并且在不同的状态下它的表现是不同的,比如自动售货机只有处于 状态 的时候才卖商品,除非你往里面投了一枚硬币,它才卖东西。现在你可以清楚地看到策略模式和状态模式之间的区别,这些是不同的意图。状态模式帮助对象管理状态,而策略模式允许客户端选择不同的行为。另一个不太容易看出的区别是谁在推动行为的改变。在策略模式中,这是一个向上下文提供各种策略的客户端;在状态模式中,转换由上下文或对象本身的状态控制。此外,如果您自己管理 State 对象中的状态更改,则必须有对上下文的引用,例如,自动售货机必须能够调用方法来更改上下文的当前状态。另一方面,策略对象从不包含对上下文的引用;客户端本身将其选择的策略传递给上下文。状态模式和策略模式之间的区别是有关 Java 模式的常见面试问题之一,在这篇关于 Java 模式的文章中我们将仔细研究它。我们将探讨 Java 中的策略模式和状态模式之间的一些异同,这将帮助您加深对这些模式的理解。 StrategyhasCoinsetState()

状态模式和策略模式之间的相似之处

如果您查看状态模式和策略模式的 UML 图,您会发现两者看起来很相似。使用 State 来更改其行为的对象称为Context-object,类似地,使用 Strategy 来更改其行为的对象称为Context-object。请记住,客户端与Context对象进行交互。在 State 模式的情况下,上下文将调用方法委托给 State 对象,该对象作为当前对象保存;在 Strategy 模式的情况下,上下文使用 Strategy 对象作为参数或在创建期间提供对象的上下文。 Java 中状态模式的 UML 图 Java 中状态模式和策略模式的区别 - 2这个状态模式的 UML 图描述了用 Java 创建面向对象自动售货机设计的经典问题。您可以看到自动售货机的状态是使用接口来表示的,然后该接口有一个实现来表示特定的状态。每个状态还引用对象上下文,以作为上下文中调用的操作的结果转换到另一个状态。 Java 中策略模式的 UML 图 Java 中状态模式和策略模式的区别 - 3该策略模式的 UML 图包含各种功能实现。由于排序算法有很多种,这种设计模式允许客户端在对对象进行排序时选择一种算法。事实上,Java Collection 框架使用这种模式来实现一种Collections.sort()用于对 Java 中的对象进行排序的方法。唯一的区别是,它不允许客户端选择排序算法,而是允许客户端通过将 Comparator或 Comparable 接口的实例传递给 Java 来指定比较策略。让我们看一下 Java 中这两种主要设计模式之间的一些相似之处:
  1. 状态和策略这两种模式都可以轻松添加新状态和策略,而不会影响使用它们的对象的上下文。

  2. 这两者都根据开放/封闭原则维护您的代码,这意味着设计将对扩展开放,但对修改封闭。在状态和策略模式的情况下,对象的上下文不允许修改、引入新的状态或新的策略,或者不需要修改其他状态的上下文,或者进行最小的更改。

  3. 正如状态模式中对象上下文以对象的初始化状态开始一样,在 Java 中的策略模式中,对象上下文也有一个默认策略。

  4. 状态模式以不同的对象状态的形式表示不同的行为,而策略模式以不同的对象策略的形式表示不同的行为。

  5. 策略和状态这两种模式都依赖于行为实现的子类。每个具体策略都扩展了一个抽象策略;每个状态都是用于表示状态的接口或抽象类的子类。

Java 中策略模式和状态模式的区别

现在我们知道状态和策略模式在结构上是相似的,但它们的意图是不同的。让我们看看这些设计模式之间的一些关键区别。
  1. 策略模式封装了一组相关的算法,并允许客户端在运行时使用可互换的行为,而不管运行时的组合和委托,而状态模式帮助类在不同的状态下表现出不同的行为。

  2. 状态和策略模式之间的下一个区别是状态封装了对象的状态,而策略模式封装了算法或策略。由于状态与对象相关联,因此无法重用,但通过将策略或算法与其上下文解耦,我们可以重用它。

  3. 在状态模式中,个人状态可能包含对上下文的引用以实现状态之间的转换,但策略不包含对其使用的上下文的引用。

  4. 策略的实现可以作为参数传递给将使用它的对象,例如 Collection.sort() 接受一个比较器,它是一个策略。另一方面,状态是对象上下文本身的一部分,并且随着时间的推移,对象的上下文从一种状态转换到另一种状态。

  5. 虽然策略和状态都遵循开放/封闭原则,但策略也遵循单一责任原则,因为每个策略都包含单独的算法,不同的策略是相互独立的。改变一种策略并不需要改变另一种策略。

  6. 策略模式和状态模式之间的另一个理论上的区别是,创建者定义了对象的“如何”部分,例如“如何”排序对象对数据进行排序,而状态模式定义了“什么”和“何时”部分对象的属性,例如对象处于某种状态时可以做什么。

  7. 状态转换的顺序在状态模式中被明确定义;而策略模式则没有这样的要求。客户可以自由选择他选择的策略的任何实施。

  8. 策略模式的一些常见示例是算法的封装,例如排序算法、加密算法或压缩算法。如果您发现您的代码必须使用不同种类的相关算法,您应该考虑使用策略模式。另一方面,认识状态模式的使用非常容易,如果您需要控制状态以及状态之间的转换而不需要大量嵌套条件语句,那么状态模式是正确的使用模式。

  9. 状态和策略模式之间最后但最重要的区别之一是,对策略的更改由客户端执行,而对状态的更改可以由上下文或对象的状态本身执行。

这就是Java 中状态模式和策略模式之间的区别。正如我所说,两者在类和 UML 图中看起来很相似,都提供开放/封闭原则并封装行为。使用策略模式来封装在运行时暴露给上下文的算法或策略(可能作为参数或复合对象),并使用状态模式来控制 Java 中的状态转换。原创在这里
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION