“责任链”和“战略”模式之间有什么区别?

时间:2011-02-18 08:20:31

标签: design-patterns strategy-pattern chain-of-responsibility

我提出这个问题是因为another question我几天前就问过这个问题 我必须解决一个特定的问题,在得到两个回复之后,我意识到两个模式可以帮助解决这个问题(以及任何其他类似问题)。

  1. 责任链
  2. 策略
  3. 我的问题是:

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

6 个答案:

答案 0 :(得分:24)

他们非常不同。

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

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

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

这种模式是现在无处不在的控制反转的基础。研究下一次完成经典模式后。

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

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

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

答案 1 :(得分:3)

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

在策略中,所有对象都具有相同的界面,但是一些外力必须提供使用的对象。

答案 2 :(得分:2)

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

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

策略是关于处理方法或算法选择。举例说明您想要计算某些样本的平均值的情况。任何算法在给定的上下文中可能“总是”正确(例如,所有具有策略的类都做同样的事情:计算平均值),但计算平均值的方式,或计算平均值的策略从一个类到另一个类不同,策略模式允许您以分离的方式选择要使用的策略。

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

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

修改

责任链的某些成员可能会使用策略模式来开展工作

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

最重要的区别是实现的语义行为。

Chain of Responsibility可以将[{1}}个职责应用于输入,并且每个0...ALL决定是否对输入执行操作然后将其传递。这是一个程序模式,因为可以应用所有责任。

  

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

Responsibility只有一种策略适用于输入。这是一种通常的创新模式,因为只应用了一种策略。

  

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

两者都可以使用Strategy作为List实施,当Visitor Pattern返回Strategy时,您可以停止访问。< / p>

true也可以实现为Strategy Pattern,其中MapKey,可以决定结束密钥的迭代,然后你就可以获得Predicate这就是你的结果。

答案 5 :(得分:0)

策略模式:

  1. 这是一种行为模式
  2. 它基于委派
  3. 通过修改方法行为来改变对象的内容
  4. 它曾用于在算法族之间切换
  5. 它在运行时更改对象的行为。将从一系列算法中选择一种算法。
  6. 看一下战略范例的SE问题:

    Real World Example of the Strategy Pattern

    责任链:

      

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

    关键点:

    1. 多个对象可以处理请求,处理程序可能不是特定对象
    2. 在责任链模式中,请求将通过一系列对象传递,直到它被处理完毕。但在Strategy中,将在运行时从一系列算法中选择一种特定的算法。
    3. 真实世界示例:在公司中,指定角色对处理购买请求有特定限制。如果具有指定角色的人没有足够的权力来批准购买账单,他会将命令/请求转发给拥有更多权力的继任者。此链将继续,直到处理命令。

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

      Chain-of-responsibility_pattern

      来自oodesign的

      Chain-of-responsibility-pattern

      来自sourcemaking的

      chain_of_responsibility