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

Is Chain of Responsibility pattern just an overkill ? A List of Handlers can accomplish the same

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

public class ConcreteHandler1
    public void handle() {
        if(can handle)
            handle the request
        else 
            concreteHandler2.handle(); 
    }

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

for(Handler handler : handlers) {
    if(handler can handle the request)
        handle
}

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

  1. 这个for循环在哪些方面不如COR? COR不就是大材小用吗?
  2. 是否存在此 for 循环更好的场景以及 COR 更好的其他场景? 在您的回答中 - 如果您能在进入详细解释之前先用 Yes/No 回答这些问题,那就太好了。

我知道这上面已经有一个post-What are the advantages of chain-of-responsibility vs. lists of classes?但是它并没有澄清我的疑惑

链是递归组织的,以便处理程序可以:

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

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

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