我正在实现责任链模式。
我有可以组合在列表中的不同策略,并且我有一个处理策略列表的处理器。每个策略都可以处理CustomInput,并且可以选择是否也应处理其余策略。
interface Policy {
public boolean process(CustomInput input);
}
interface Processor {
public void process(List<Policy> policies, CustomInput input)
}
我将实现在策略列表上循环的Processor,并检查每个策略的 boolean 结果,以了解是否继续其他策略。
我的同事建议将下一个策略传递给每个策略,然后让他们调用(或不调用)下一个策略(例如,像FilterChain一样)。
我的问题如下:
在遍历每个策略并检查其结果之后,在第二个解决方案(将下一个策略传递给当前正在处理的策略)中,我没有看到任何好处吗?
最佳答案
传递下一个的想法对我来说毫无意义。所以我想要一个链条:
A - B - C - D
C如何知道D?如果在C的代码中,则对链的任何更改都将实现起来很麻烦。
链式店需要要么遵循已经存在的其他路径,例如响应者在向各自的父公司发出求助请求时就这样做(例如《四人帮》一书中的例子),或者您需要构建链式店,这就是为什么在Go4部分的底部,他们将Composite Pattern称为自然存在的帮凶。
另请注意,执行“责任链”的主要原因之一是可能在 Material 上运行的类型不同。这使得用Java接口(interface)完美地实现它。
要回答您的主要问题:在这种情况下,使用责任链有两个好处:1.您并不是在制造一个上帝的对象,它不知道要实现目标可能发生的所有事情(成功制定一项政策) ,以及2.您不必放入很多难看的检查代码来查看何时到达终点,因为处理它的人(不调用其后继者)将提示已完成的物品返回。