17

我提出这个问题是因为几天前我在这里问了另一个问题。
我必须解决一个特定问题,在收到两次回复后,我意识到两种模式可以帮助解决该问题(以及任何其他类似问题)。

  1. 责任链
  2. 战略

我的问题是:

这些模式之间究竟有什么区别?

4

6 回答 6

32

他们非常不同。

策略是关于拥有一个通用接口,您可以使用它来提供算法的不同实现,或者具有一些共同依赖关系的几种算法或逻辑片段。

例如,您CollectionSorter可以支持SortingStrategy(合并排序、快速排序、冒泡排序)。它们都有相同的界面和目的,但可以做不同的事情。

在某些情况下,您可能决定在内部确定策略。也许排序器有一些基于集合大小等的启发式方法。大多数时候它确实是从外部注入的。这是该模式真正闪耀的时候:它为用户提供了覆盖(或提供)行为的能力。

这种模式是现在无所不在的控制反转的基础。一旦你完成了经典模式,接下来研究一下。

责任链是关于拥有一个通常从更详细到更通用的对象链。链中的每个部分都可以提供答案,但它们具有不同的详细程度。

流行的 GOF 示例是上下文帮助系统。当您单击桌面应用程序中的组件时,会显示哪些帮助?链中的第一项可以为您单击的组件寻求帮助。Next in chain 可以尝试显示整个包含对话框的帮助。接下来是应用程序模块......等等。

看起来您还没有,但应该阅读 GOF“设计模式”经典。

于 2011-02-18T08:31:44.160 回答
10

在责任链中,如果对象无法处理,则将调用发送到链中的下一个对象是每个对象的责任。

在 Strategy 中,所有对象都具有相同的接口,但必须有一些外部力量来提供使用哪个接口。

于 2011-02-18T08:32:11.413 回答
2

大多数模式在代码(甚至 uml)中看起来非常相似,但模式集中于上下文,职责是他们打算解决的特定问题,而不是特定的源代码。两者都将不同的事物和出于不同的原因解耦。

链式模式将发送请求的责任与处理请求的责任分开。可能有许多类可以处理相同类型的请求(这些类通常实现相同的接口),但是该模式允许请求从一个类(在链中)传递到另一个类,直到处理程序最适合处理请求的人得到它并负责处理请求(或直到空处理程序得到它并指示链的末端)。如果您允许错误的处理程序处理请求,结果可能“永远”是正确的

该策略是关于处理方法或算法选择的。以您要计算某些样本的平均值的情况为例。任何算法在给定的上下文中可能“总是”是正确的(例如,所有具有策略的类都做同样的事情:计算平均值),但是计算平均值的方式或计算平均值的策略因一个类而异,并且策略模式允许您以解耦的方式选择使用哪种策略。

现在将其与链模式进行比较,其中可能有一个计算平均值的请求,其中有一个负责计算平均值的处理程序,并且可能有另一个计算标准偏差的请求,其中有另一个处理程序负责计算平均值。计算标准差。因此计算平均值的请求在任何情况下都不会由最适合的处理程序以外的任何其他处理程序处理。其中,策略中的任何类都可以计算平均值,如果你不喜欢一个类计算平均值的方式,你可以“交换”一个策略为另一个。

在源代码中实现这些的方式可能因程序员而异,但应该PTSUT(通过相同的单元测试“)

编辑:

责任链中的某些成员可能会使用策略模式来完成他们的工作

于 2013-03-03T21:48:15.967 回答
2

最显着的区别是实现的语义行为。

AChain of Responsibility可以拥有0...ALL应用于输入的责任,每个责任Responsibility决定是否对输入采取行动,然后将其传递。这是一种程序模式,因为可以应用所有职责。

想象一下对输入应用一系列过滤器,每个过滤器在将输入传递到下一个过滤器之前决定它是否应该处理输入。

AStrategy有一个且只有一个策略适用于输入。这通常是一种创建模式,因为只应用了一个策略。

想象一下,决定使用哪个数据库驱动程序以及如何根据输入从数据库驱动程序列表中创建连接,一旦找到正确的驱动程序,它就是唯一使用的驱动程序。

两者都可以实现为 a Listusing a ,不同之处在于您在 a返回时Visitor Pattern停止访问Strategytrue

AStrategy Pattern也可以实现为 a Mapwhere the Keyis aPredicate可以决定结束键的迭代,然后你就得到了Value,这就是你的结果。

于 2017-05-25T19:28:02.910 回答
1

您可以将责任链视为更通用的策略模式的特例。正如 Konrad 所说,您使用基于模式的解决方案解决的问题是不同的。

顺便说一句:您几乎可以在任何 GOF 模式中找到一种策略。

于 2011-02-18T08:37:12.533 回答
0

策略模式:

  1. 这是一种行为模式
  2. 它基于委托
  3. 它通过修改方法行为来改变对象的内容
  4. 它用于在算法系列之间切换
  5. 它在运行时改变对象的行为。一种算法将从算法族中选择。

看看这个 SE 问题的策略示例:

策略模式的真实示例

责任链:

责任链模式是一种设计模式,由一个命令对象源和一系列处理对象组成。每个处理对象都包含定义它可以处理的命令对象类型的逻辑;其余的被传递给链中的下一个处理对象。

关键点:

  1. 多个对象可以处理请求并且处理程序可能不是特定对象
  2. 在责任链模式中,请求将通过一个对象链传递,直到它被处理。但是在策略中,将在运行时从一系列算法中选择一个特定的算法。

现实世界的例子:在公司中,指定的角色对处理采购请求有特定的限制。如果具有指定角色的人没有足够的权力批准采购法案,他会将命令/请求转发给拥有更大权力的继任者。该链将一直持续到命令被处理为止。

请参阅以下有用的 SE 问题/链接

责任链模式

oodesign的责任链模式

来自sourcemaking的chain_of_responsibility

于 2016-02-10T14:27:07.547 回答