【发布时间】:2013-12-03 14:52:43
【问题描述】:
我正在实施责任链模式。
我有可以组合在一个列表中的不同策略,并且我有一个处理策略列表的处理器。每个策略都可以处理 CustomInput,并且可以选择是否也应处理其余策略。
interface Policy {
public boolean process(CustomInput input);
}
interface Processor {
public void process(List<Policy> policies, CustomInput input)
}
我打算实现处理器循环遍历策略列表并检查每个策略的布尔结果以了解是否继续执行其余策略。
我的同事建议将下一个 Policy 传递给每个 Policy,并让他们调用(或不调用)下一个 Policy(例如 FilterChain 所做的)。
我的问题如下:
在第二种解决方案(将下一个策略传递给当前正在处理的策略)中,与循环每个策略并检查其结果相比,我没有看到任何好处吗?
【问题讨论】:
-
在第一种情况下,顶级运营商负责应用所有策略。在第二种情况下,每个策略必须知道它的子策略并且可以决定是否应用它。这取决于您将责任放在哪里来应用这些政策。
-
在某些情况下,这样的模式会成为开销,也应该考虑到这一点。虽然 CoR 很好用,但不要忘记 KISS。有案例,有案例要考虑。
-
@Matheus,就我而言,我确实需要它(策略列表来自另一个服务的某个地方,并且处理代码不知道它们在做什么,只有在它可以继续之前必须处理它们下一步)。
-
除非有目的,否则将迭代和选择步骤与处理步骤耦合似乎是不必要的耦合。
标签: java design-patterns chain-of-responsibility