是什么样的策略设计模式和状态设计模式之间的区别?(What is the difference be

2019-09-03 14:43发布

什么是战略设计模式与国家的设计模式之间的区别是什么? 我正想通过在网络上有好几篇文章,但无法分辨出区别清楚。

有人可以解释以浅白的文字有什么区别?

Answer 1:

老实说,这两种模式在实践中非常相似,它们之间的差别确定不同的倾向问你谁在改变。 一些流行的选择是:

  • 美国存储包含它们的上下文对象的引用。 策略不会。
  • 各国被允许自行更换(IE:改变上下文对象的别的东西的状态),而战略则不是。
  • 策略传递给上下文对象作为参数,虽然国家通过上下文对象本身产生的。
  • 策略只能处理一个单一的,特定的任务,而国家提供的一切(或大部分一切)底层实现上下文对象一样。

“经典”的实施将匹配任何一国或战略列表中每一个项目,但你可以在已有的两种混合杂交运行。 无论是特定的一个更国务院y或战略-Y最终是一个主观的问题。



Answer 2:

  • Strategy模式实际上是关于具有不同的实现,完成(基本上)同样的事情,这样的策略需要一个实现可以取代其他。 例如,你可能有一个策略模式不同的排序算法。 对象的呼叫者不更改基于其上所采用的策略,但是无论战略的目标是一致的(排序集合)。
  • 状态模式是这样做基于状态不同的事情,而留下容纳从每一个可能的状态的负担减轻调用者。 因此,例如,你可能有一个getStatus()将返回基于对象的状态不同状态的方法,但该方法的调用者不必进行不同的编码,以考虑每个潜在状态。


Answer 3:

所不同的只是在于他们解决不同的问题:

  • 状态模式有什么 (州或类型)的对象是(在)交易-它封装了状态相关的行为,而
  • 策略模式与对象如何执行特定任务的交易-它封装了一个算法。

为实现这些目标不同的构造是却很相似; 两个图案是与委托组合物的例子。


他们的优势的一些看法:

通过使用状态模式的国有控股(上下文)类是从什么状态的知识减轻或键入它是什么状态或类型可用。 这意味着该类坚持开 - 闭设计原则(OCP):类是在什么状态/类型有关闭了变化,但美国/类型是开放的扩展。

通过使用策略模式的使用算法-(上下文)类是从如何执行特定任务的知识缓解( -的“算法”)。 这种情况也创建了一个坚持OCP; 该类被关闭了关于如何执行此任务的变化,但设计是其它算法解决这个任务增加非常开放。
这可能也提高了上下文类坚持单一职责原则(SRP)。 此外,该算法容易变得可供其他类重用。



Answer 4:

可有人请外行的角度解释一下吗?

设计模式是不是真正的“门外汉”的概念,但我会尽量做到尽可能明确。 任何设计模式可以在三个维度来考虑:

  1. 图案解决了这个问题;
  2. 的模式(类图)的静态结构;
  3. 图案的动力学(序列图)。

让我们比较一下现状与对策。

问题解决模式

国家在两种情况之一使用[GoF的书页。 306] :

  • 对象的行为取决于它的状态,并且它必须在运行时取决于国家改变其行为。
  • 操作具有依赖于对象的状态大,多条件语句。 这种状态通常是由一个或多个列举的常量来表示。 通常情况下,几个操作将包含此相同的条件结构。 状态模式把有条件的每个分支在一个单独的类。 这可以让你把对象的状态本身就是一个对象,可以从其他对象独立地变化。

如果你想确保你确实有状态模式解决了这个问题,你应该能够用有限状态机的对象的状态进行建模。 你可以找到一个应用实例这里 。

每个状态转换是在国家界面的方法。 这意味着,对于一个设计,你必须在应用此模式之前是相当确定有关状态转换。 否则,如果您添加或删除的转变,这将需要改变接口和所有实现它的类。

我个人还没有发现这种模式对大家有用。 你总是可以实现利用查询表有限状态机(它不是一个面向对象的方式,但它工作得很好)。

策略用于以下[GoF的书页。 316] :

  • 许多相关的类只是在他们的行为是不同的。 策略提供了一种方式来配置一类具有许多行为之一。
  • 你需要一个算法的不同变体。 例如,你可以定义反映了不同的空间/时间权衡的算法。 当这些变体是如算法[HO87]一个类层次结构中实现的策略可以被使用。
  • 一种算法使用客户端不应该知道的数据。 使用策略模式以避免暴露复杂的,具体的算法,数据结构。
  • 一个类定义了许多行为,而这些出现在其运营的多个条件语句。 相反,许多条件句,将相关的条件分支到自己的策略类。

在哪里申请策略最后一种情况是与被称为重构更换条件有多态性 。

摘要:现状与对策解决非常不同的问题。 如果你的问题不能用有限状态机进行建模,然后有可能的状态模式是不恰当的。 如果你的问题是不是封装的复杂算法的变体,那么战略并不适用。

图案的静态结构

国家具有以下UML类结构:

策略具有以下UML类结构:

小结:在静态结构而言,这两种模式是大部分相同。 实际上,图案检测工具,如这一个考虑“ 的[...]模式的结构是相同的,由一个自动的过程禁止其区别(例如,不参照概念性信息)。 ”

可以有一个主要区别,但是,如果ConcreteStates决定自己的状态转换(见上图中的“ 可能会确定 ”关联)。 这导致在具体状态之间的耦合。 例如(参见下一部分),状态A确定为状态B的过渡如果Context类决定过渡到下一个混凝土状态,这些依赖关系消失。

该格局动态

如在上面的问题的一节中提到, 状态意味着,取决于对象的一些状态在运行时行为的变化。 因此,状态转变的概念适用,与有限状态机之间的关系进行讨论。 [GoF的]提到的过渡可以在子类的ConcreteState来定义,或在集中的位置(例如,基于表的位置)。

让我们假设一个简单的有限状态机:

假设子类决定的状态转移(通过返回一个状态对象),动态看起来是这样的:

要显示策略的动态,它是有用借用一个真实的例子 。

摘要 :每一个模式采用的是多态的呼叫根据上下文做一些事情。 在State模式,多态调用(过渡)往往会导致在未来状态的变化。 在策略模式,多态调用通常不会改变的背景下(例如,通过信用卡付款一次并不意味着你会通过贝宝,下一次支付)。 同样,State模式的动态由其相应的fininte状态机,这(对我来说)是必不可少的纠正这种模式的应用程序来确定。



Answer 5:

策略模式涉及移动从一个托管类的算法的实现,并把它在一个单独的类。 这意味着,主机类并不需要提供每个算法本身,这很可能导致不洁代码的执行。

排序算法通常用作例子,因为他们都做同样的事情种类(排序)的。 如果每个不同的排序算法被放入自己的类,然后在客户端可以轻松地选择要使用的算法和模式提供了一种简单的方法来访问它。

状态模式涉及改变对象的行为,当对象的状态发生改变。 这意味着,主机类没有提供行为的实现为所有不同的状态,它可以在该主机类通常封装了一类,它提供了在给定的状态所需要的功能,并切换到不同的类当状态变化。



Answer 6:

战略代表对象“做”什么,用相同的开始和结束的结果,但在内部使用不同的方法。 在这个意义上,他们是类似于表示动词的实现。 OTOH使用状态模式对象是“是”的东西 - 一个操作的状态。 虽然它们可以代表对数据的操作,以及,它们更类似于一个名词不是动词的表示,并且被朝向状态机定制。



Answer 7:

考虑一个IVR(交互式语音应答)系统处理客户电话。 您可能需要将其程序来处理客户的:

  • 工作日
  • 假期

为了处理这种情况,你可以使用状态模式

  • 假日 :IVR只是简单地回应说,“ 来电可只在工作日上午9时之间取到下午5点 ”。
  • 工作日 :它由客户连接到客户服务主管响应。

客户连接到支持执行的过程可以利用自身在管理人员基于任挑了策略模式来实现:

  • 轮循
  • 最近最少使用
  • 其它基于优先级的算法

该策略模式决定在执行这些“ 何时 ”一些动作和状态模式在“ 如何 ”执行决定。



Answer 8:

策略:策略是固定的,通常包括几个步骤。 (排序仅构成一个步骤,因此是一个非常不好的例子,因为它是为了理解这个模式的目的太原语)。 你的“主”常规的策略是调用一些抽象方法。 例如, “进入会议室战略”, “主法” 是goThroughDoor(),它看起来像:approachDoor(),如果(锁定())openLock(); 开门(); enterRoom(); 转(); 关门(); 如果(wasLocked())lockDoor();

现在,这个子类一般的“算法”从一个房间到另一个房间移动通过可能锁着的门可以实现算法的步骤。

换句话说继承的策略不会改变基本的算法,只有个别步骤。

上面是一个模板方法模式。 现在把属于一起的步骤(解锁/锁定和开启/关闭)到自己的执行对象,并委托给他们。 例如,用一个钥匙的锁,并用代码卡锁有两种类型的锁。 从战略“步骤”对象代表。 现在你有一个策略模式。

状态模式是完全不同的东西。

你有一个包裹对象和被包装的对象。 被包裹的一个是“状态”。 国家物体只能通过它的包装访问。 现在,你可以在任何时候改变包装的对象,因此,包装似乎改变其状态,甚至是它的“类”或类型。

如您对服务日志。 它接受一个用户名和密码。 它只有一个方法:登录(用户名字符串,字符串passwdHash)。 相反,决定本身是否日志上被接受与否,它代表决定的状态对象。 该状态下对象通常只是检查,如果用户名/密码组合是有效的,并执行对数。 但现在你可以通过一个只让priviledged用户登录(在maintanace时间如)或者通过一个可以让任何人登录交换“检查”。 这意味着“检查”表示“登录状态”的系统。

最重要的区别是:当你已经选择你坚持下去,直到你用它做的战略。 这意味着你调用它的“主要手段”,并且只要一个正在运行,你永远不变的策略。 OTOH在你的系统,你改变状态任意你认为合适的运行期间的状态模式的情况。



Answer 9:

当你有多个算法为特定任务策略模式是用来和客户决定在运行时使用的实际执行情况。

从UML图维基战略格局的文章:

主要特点:

  1. 这是一种行为模式。
  2. 它是基于授权。
  3. 它通过修改方法行为改变对象的胆。
  4. 它用于家庭的算法之间切换。
  5. 它改变了对象在运行时的行为。

请参阅这篇文章以获得更多信息和现实世界的例子:

策略模式的现实世界的例子

状态模式允许一个对象来改变它的行为,当其内部状态的变化

从UML图的wiki状态模式的文章:

如果我们要改变基于其状态的对象的行为,我们可以在对象有一个状态变量和使用if-else条件块来执行基于状态不同的动作。 使用State模式提供系统化,失去耦合的方式,通过语境下国家实施以实现这一目标。

请参阅本journaldev更多细节的文章。

从主要差异sourcemaking和journaldev文章:

  1. 现状对策的区别在于绑定时间。 该战略是一个绑定-once模式,而国家更加动感
  2. 现状对策之间的差别是在意向。 随着策略,算法的选择是相当稳定的随着国家,在“背景”对象的状态的变化导致其从它的战略目标的“调色板”选择
  3. 上下文包含状态实例变量并且可以有多个任务,它的实现,而在战略格局战略作为参数传递给方法和上下文对象传递没有任何变量来存储它可以是依赖于国家


Answer 10:

深入浅出,

在策略模式,没有国家或所有的人都有相同的状态。 所有一个具有正在执行任务,比如不同的医生治疗以不同的方式与相同状态同一患者同一疾病的不同方式。

在状态模式,主观上也有州,如病人的当前状态(比如高温或低温),基于动作(中药处方)的这下一课程将decided.And一个状态可能导致其他状态,所以状态到状态依赖性(组合物在技术上)。

如果我们在技术上尝试去了解它,根据双方的代码比较,我们可能失去的情况主观性,因为两者看起来非常相似。



Answer 11:

这两种方式委托给具有几个衍生物的基类,但它只有在国家模式,这些派生类持有参考回到上下文类。

看它的另一种方式是,策略模式是国家模式的简化版本; 子模式,如果你喜欢。 如果你想派生状态保持引用返回到上下文或没有这真的取决于(即:做你想让他们叫上下文的方法)。

欲了解更多信息:罗伯特·马丁Ç(马丁弥)在其著作“敏捷原则,模式与实践在C#”回答这个问题。 ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )



Answer 12:

这是一个很老的问题,不过,我也一直在寻找同样的答案,这是我发现。

对于State模式让我们考虑内侧播放器的一个例子播放按钮。 当我们确实发挥它开始播放,使意识到它正在播放的背景。 每次客户要进行播放操作,他会检查玩家的当前状态。 现在,客户知道对象的状态是通过上下文对象打得那么他所说的暂停状态对象的动作方法。 在客户端实现的状态,并在其上需要做什么样的动作状态的部分可以实现自动化。

https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm

在策略模式的情况下,类图的排列是相同的状态的图案。 客户来到这个安排做一些操作。 也就是说,不是在不同的状态有不同的算法说,例如不同的分析,认为需要对模式进行。 在这里,客户告诉它想要做什么算法(业务定义的自定义算法),然后执行的上下文。

https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

这两种工具开闭原则,因此开发商有新的国家加入到状态模式和新算法的能力。

但不同的是它们的用途是用于执行基于该对象的状态不同的逻辑状态的图案。 而在策略不同的逻辑的情况。



Answer 13:

国家自带的状态派生类中一点点的依赖关系:像一个国家知道后,它的到来其他国家。 例如,说到夏天为冬天任何季节的状态,或者存款状态购物后交货状态之后。

在另一方面,战略有一个像这些没有相关性。 在这里,任何国家都可以基于该方案/产品类型进行初始化。



Answer 14:

的差中讨论http://c2.com/cgi/wiki?StrategyPattern 。 我已经使用策略模式,用于允许不同的算法用于分析数据的整体框架内选择。 通过您可以在不改变总体框架和它的逻辑添加算法。

一个典型的例子是,你有爱美的优化功能的框架。 该框架建立在数据和参数。 策略模式允许用户选择算法,如sttepest下坡,共轭梯度,BFGS等而不改变架构。



Answer 15:

这两种战略与国家模式具有相同的结构。 如果你看一下这两种模式的UML类图。它们看起来一样,但他们的意图是完全不同的。 国家设计模式是用来定义和管理对象的状态,而策略模式是用来定义一组可互换的算法,并让客户选择其中之一。 因此,策略模式是客户驱动的模式,而对象可以管理有国家本身。



Answer 16:

总之,与策略模式,我们可以设置在飞行中的一些行为,与国家的模式,我们可以肯定,一个对象将在内部改变它的行为与它的状态的变化。



Answer 17:

当你有一个项目,该项目可分为2项任务:

任务1:你可以用两种不同的算法之一来完成:ALG1,ALG2

任务2:你可以使用三种不同的算法之一来完成:ALG3,ALG4,ALG5

ALG1和ALG2是可互换的; ALG3,ALG4和ALG5是可互换的。

选择在任务1和任务2执行的算法依赖于状态:

状态1:你需要在ALG1任务1和ALG3在任务2

状态2:你需要在ALG2任务1和ALG5在任务2

您上下文可以从状态1改变状态对象状态2.然后,你的任务就由ALG2和ALG5来完成,而不是ALG1和ALG3。

您可以为任务1或任务2。这是策略模式添加更多的互换算法。

您可以在任务1和任务2 State模式的算法的不同组合,更多的国家允许您从一个状态切换到另一个执行算法的不同组合。



文章来源: What is the difference between Strategy design pattern and State design pattern?