【问题标题】:Can each handler handle the request in Chain of Responsibility Pattern?每个处理程序可以处理责任链模式中的请求吗?
【发布时间】:2015-01-08 12:21:34
【问题描述】:

这里我将不再提及责任链 (CoR) 模式定义。但是我想知道的是,如果链中有一系列处理程序,并且如果一个请求由所有处理程序处理,并且如果开始处理程序失败,最后一个处理程序将不会处理该请求,是否违反模式?

我会用一个例子来解释。假设有一个允许用户搜索书籍的在线应用程序。当用户提交请求时,系统会进行搜索并显示结果。假设,此功能以 CoR 模式实现。

第一个处理程序获取请求参数(书籍类别、价格、作者等),并添加其他参数(例如从请求中挑选的用户国家、地区、语言)并进行某些验证。
第二个处理程序获取第一个处理程序的输出并查看数据库并创建结果列表。这些结果被传输到第三个处理程序。第三个处理程序将对结果进行排序、过滤、更改语言。如果前面的任何处理程序失败,则后面的处理程序将无法完成其工作。

使用 CoR 是否违背了它的概念?或任何其他好的模式?

【问题讨论】:

  • 这听起来像pipe-and-filter,而不是责任链。如果设计符合您的需要,请不要担心“违反” CoR。模式是解决问题的工具;你不应该改变你的问题以适应工具。 CoR的problemAvoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

标签: java design-patterns


【解决方案1】:

责任链通常只有一个处理程序负责处理请求。

一个很好的类比来自 1970 年代的 Classic Tootsie Roll Commercial - "How Many Licks",一个男孩(请求)试图回答“到达 Tootsie Pop 的中心需要舔多少次?”这个问题的答案。

他去找第一只动物,谁不知道答案,但谁把他送到下一只动物,等等。最后,“请求”被处理,男孩得到了他的答案。

男孩只知道链条的开头(所有其他动物参考都是按顺序给出的)。

在您的问题中,您似乎有一个明确定义的(静态)处理顺序。除非您需要动态地交换步骤,或者在其他项目中重用步骤,否则简单的模块化模式没有任何问题:它被称为保持简单愚蠢 - KISS。

【讨论】:

    【解决方案2】:

    如果一个过滤器在功能上依赖于另一个过滤器(即期望在其执行之前发生某些事情),那么这两个功能应该在同一个过滤器的范围内执行。 COR的主要逻辑是它的模块化,也就是说你可以随意添加/删除过滤器而不影响管道中数据的流动。

    【讨论】:

      【解决方案3】:

      CoR 的想法是每个链处理程序都不知道链(如果无法处理请求,只有他的继任者委托),并且当您将链元素建立在彼此之上时,您违反了 CoR 的核心概念我的眼睛-我更喜欢使用装饰器来使用原始对象用附加数据装饰您的原始对象-在您的示例中,您将有一个请求参数对象,然后是一个结果对象,该对象用此请求的结果装饰请求参数对象然后第三个对象通过排序、过滤和/或更改语言来装饰结果。

      【讨论】:

      • 只有当处理程序相互“包装”并且需要在运行时动态添加/删除时,装饰器才对我来说是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多