责任链

时间:2015-09-02 12:56:23

标签: design-patterns chain-of-responsibility

为什么我需要使用CoR,如果我可以编写if-else而不是通过多个处理程序,我可以找到我需要的任何处理程序并将处理委托给特定的处理程序。

我认为,CoR并没有被用作管道来处理多个处理程序中的相同请求(例如:https://github.com/RichJones22/chainOfResponsibility_cpp/blob/master/main.cpp)。那么我为什么要使用CoR?

2 个答案:

答案 0 :(得分:1)

CoR有哪些优势?

你是对的,它是一种管道;管道的每一步都通过基类接口与下一步交互。如果每个管道步骤不依赖于/直接与前面步骤的上下文绑定,则可以使用它。

每个类都会实现自己的管道阶段,优点是:

  • 模块化:每个管道类都会处理其定义明确的方面/命令;每个命令对象/管道阶段的代码应该更清晰,更易于阅读/维护。

  • 一个优点是您可以独立于其他命令/管道类调试/测试这些类中的每一个;如果您有单元测试,这很好。

  • 您可以在工厂/构建器类中配置不同的管道实例,并将命令类视为构建块,并根据配置/实际要求进行堆叠。

    一个例子是记录阶段;你会添加一个只执行日志记录的派生类,并将其添加到管道的末尾,我必须记录一个事件;如果您处于“无记录模式配置”,则不会堆叠此命令对象。

答案 1 :(得分:0)

如果你必须在一个案例中执行链中10个元素中的4个,在另一个案例中执行2个,在另一个案例中执行9个,那么CoR明显优于大量的嵌套if语句。

考虑经典实现,例如验证器链。您可以在特定情况下插入和拔出某些验证器,您可能会在第一次验证错误时失败,或只收集所有验证器。