Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个处理程序能否以责任链模式处理请求?_Java_Design Patterns - Fatal编程技术网

Java 每个处理程序能否以责任链模式处理请求?

Java 每个处理程序能否以责任链模式处理请求?,java,design-patterns,Java,Design Patterns,在这里,我不再重复提到责任链(CoR)模式定义。然而,我想知道的是,如果一个链中有一系列处理程序,并且如果一个请求由所有处理程序处理,并且如果开始处理程序失败,最后一个处理程序将不会处理该请求,这是否违反了该模式 我会举例说明。假设一个允许用户搜索书籍的在线应用程序。当用户提交请求时,系统进行搜索并显示结果。假设此功能是以CoR模式实现的 第一个处理程序获取请求参数(图书类别、价格、作者等),并添加其他参数(如从请求中选择的用户国家、地区、语言)并进行某些验证。 第二个处理程序获取第一个处理程序

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

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

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


CoR的使用是否与其概念相反?或者其他什么好模式

CoR的思想是,每个链处理程序都不知道该链(如果不能处理请求,则只有其继任者授权请求)在我看来,当你把你的链元素建立在彼此的基础上时,你违反了CoR的核心概念-我更喜欢使用装饰器用原始对象的附加数据装饰原始对象-在你的示例中,你会有一个请求参数对象,然后是一个结果对象,用此请求的结果装饰请求参数对象,然后是第三个对象,用排序、筛选和/或更改语言装饰结果。

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

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

一个很好的类比来自20世纪70年代,当时一个男孩(请求)试图回答“要舔多少下才能到达Tootsie Pop的中心?”

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

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


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

这听起来像是责任链,而不是责任链。如果设计符合您的需要,不要担心“违反”CoR。模式是解决问题的工具;你不应该改变你的问题来适应工具。CoR's:
通过为多个对象提供处理请求的机会,避免将请求的发送者与其接收者耦合。链接接收对象并沿链传递请求,直到对象处理它。
Decorator仅在处理程序彼此“包装”并且需要在运行时动态添加/删除时才对我合适。