责任链:循环还是下一个?

时间:2013-12-03 14:52:44

标签: java design-patterns chain-of-responsibility

我正在实施一系列责任模式。

我有不同的策略可以组合在一个列表中,我有一个处理策略列表的处理器。每个策略都可以处理CustomInput,并可以选择是否也应该处理其余的策略。

interface Policy {    
  public boolean process(CustomInput input);    
}

interface Processor {    
  public void process(List<Policy> policies, CustomInput input)    
}

我打算在策略列表上实现Processor循环,并检查每个策略的布尔结果,以了解是否继续使用其余策略。

我的同事建议将下一个策略传递给每个策略,让他们调用(或不调用)下一个策略(例如FilterChain)。

我的问题如下:

我是否在第二个解决方案中没有看到任何好处(将下一个策略传递给当前处理的策略),而不是循环遍历每个策略并检查它的结果?

3 个答案:

答案 0 :(得分:3)

您是否可以实施允许两个组件进行部件控制的中途解决方案?

interface Policy {
  public Policy process(CustomInput input, Policy defaultNext);
}

process可以默认返回defaultNext,除非它有自己的选择。

答案 1 :(得分:1)

传递下一个的想法对我来说毫无意义。所以我想要一个链:

A - B - C - D

C如何了解D?如果它在C的代码中,那么对链的任何改变都将是一个巨大的麻烦。

链条需要遵循已经存在的其他路径,例如响应者在他们向每个父母提出帮助请求时会这样做(例如,在Gang of Four书中),或者你需要构建链,这就是为什么在Go4的部分底部,他们提到复合模式作为一个自然发生的帮凶。

另请注意,执行“责任链”的主要原因之一是可能对项目进行操作的类型不同。这使得用Java完善的界面实现它。

回答你的主要问题:在这种情况下使用责任链的好处有两个方面:1。你没有制造一个上帝对象,知道为实现目标可能发生的所有事情(成功构建一个政策),2。你不必输入很多丑陋的检查代码来查看你何时到达终点,因为无论谁通过不调用它的继承者来处理它,都会提示返回完成的项目。

答案 2 :(得分:1)

  

我正在实施责任链模式。

不是。您同事的建议实际上是GoF如何定义责任链。

  

链中的第一个对象接收请求并处理该请求或将其转发到链中的下一个候选对象,这同样会...链中的每个对象共享一个公共接口来处理请求和访问其<链上的强>后继。 (第224页)

     

责任链可以简化对象之间的互连。它们不保留对所有候选接收者的引用的对象,而是保留对其后继者的单个引用。 (第226页)

明确CoR被定义为单链接列表。您描述的内容更像是中介模式,您的Processor扮演中介角色。权衡是集中控制与分散控制。

  

它集中了控制。中介器模式将交互的复杂性交换为中介器中的复杂性。由于中介者封装协议,因此它可能比任何单个同事都更加复杂。这会使调解员本身成为难以维护的整体。 (第277页)

如果您确信Processor只会做遍历列表并检查布尔值,那么,我认为您的设计是正确的。危险在于Processor可能获得与特定CustomInputPolicy相关的“特殊”逻辑。那是神职人员的湿滑之地。