责任链模式只是一种矫枉过正吗?处理程序列表可以完成相同的任务

Pra*_*Nvs 2 design-patterns chain-of-responsibility

在“责任链(COR)”模式中,我们创建了一个处理程序链。将请求传递给链中的第一个。它试图处理它。如果不能,它将请求转发到链中的下一个,依此类推。例如。Handler1 = new ConcreteHandler1(); handler1.handle

public class ConcreteHandler1
    public void handle() {
        if(can handle)
            handle the request
        else 
            concreteHandler2.handle(); 
    }
Run Code Online (Sandbox Code Playgroud)

我们不能简单地创建一个处理程序列表并在 for 循环中完成相同的操作吗?

for(Handler handler : handlers) {
    if(handler can handle the request)
        handle
}
Run Code Online (Sandbox Code Playgroud)

我们将以与创建链相同的方式创建处理程序列表。

  1. 这个for循环在什么方面不如COR?COR 不就是矫枉过正吗?
  2. 是否有这种 for 循环更好的场景和其他 COR 更好的场景?在你的回答中 - 如果你能在进入详细解释之前先用是/否回答这些问题,那就太好了。

我知道已经有一篇关于此的帖子- 责任链与类列表的优势是什么?但这并不能澄清我的疑虑。

Mat*_*ans 5

该链以递归方式组织,以便处理程序可以:

  • 在下一个处理程序运行之前做一些工作,包括修改下一个处理程序的输入;和
  • 在下一个处理程序运行做一些工作,包括在返回到前一个处理程序之前处理或修改下一个处理程序的输出;和
  • 使用它在下一个处理程序运行之前存储的信息来影响之后的输出。

递归只是安排所有这些的最简单和最直接的方法。要在没有递归的情况下允许类似的功能将需要更多的回调和更复杂的处理程序生命周期。

当处理程序不产生任何输出时,如 ​​HTML 事件处理程序,在之前和之后的工作都是不必要的。在这些情况下,通常按照您的建议迭代调用事件处理程序。