责任链模式是否可以很好地替代一系列条件?

时间:2018-12-08 17:01:03

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

当您需要按特定顺序执行一系列操作时,“责任链”模式是否可以很好地替代一系列条件?用这样的条件替换一个简单的方法是否是一个好主意:

public class MyListener implements MyHttpListener {

    // if false, the request will be thrown away and subsequent listeners will not be notified
    @Override
    public boolean onHttpRequestSend(HttpMessage msg) { 
        // handlers can change msg

        boolean isA = handleA(msg);
        if (isA) return false;

        boolean isB_notA = handleB(msg);
        if (isB_notA) return false;

        boolean isC_notA_notB = handleC(msg);
        if (isC_notA_notB) return true;

        ...

        throw new IllegalStateException();
    }
}

现在将其替换为责任链模式的实现:

public class MyListener implements MyHttpListener {
    @Override
    public boolean onHttpRequestSend(HttpMessage msg) {
        ProcessingStep first = new StepA()
        ProcessingResult result = first.process(new ProcessingResult(msg, true));
        return result.returnValue;
    }
}

public interface ProcessingStep {
    ProcessingResult process(ProcessingResult stepResult);
}

public class ProcessingResult {
    HttpMessage message;
    boolean returnValue;
}

public class StepA implements ProcessingStep {
    @Override
    public ProcessingResult process(ProcessingResult stepResult) {
        if (handleA()) {
            return stepResult;
        }
        else {
            return new StepB().process(stepResult);
        }
    }
}   
public class StepB implements ProcessingStep {
    @Override
    public ProcessingResult process(ProcessingResult stepResult) {
        return stepResult; // this is the last step
    }
}

2 个答案:

答案 0 :(得分:1)

您对Chain of Responsibility模式的实现不是确切的实现,因为通常处理程序链中的每个元素都必须不知道接下来会发生什么。

但是,让我们看一下CoR模式的主要好处:它可以在运行时动态更改处理程序链 (在一系列硬编码条件下可能不可用)。因此,如果您需要CoR模式的动态行为,则可以从中受益,但是如果不需要,则可以将其视为不必要的过度设计的解决方案。

答案 1 :(得分:1)

Chain of Responsibility适用于您所描述的确切场景,即用处理您请求的一个调用替换if ... else链(在示例中包装在msg中) )。

答案是:是的,您的第二个代码很好地替代了您的第一个代码。


是否应该用第二个代码替换第一段代码是另一个问题。对于像您目前拥有的代码那样简单的代码,添加设计模式可能是过大的选择。使用此模式的其他原因是:

  • if ... else块的动态排列;
  • 添加新的处理块;
  • 将处理程序重新用作 dispatchers ,能够向各个方向发出msg,从而形成责任树

  • 如果您的情况似乎需要设计模式,请继续。
  • 如果不是,则保留它。
  • 如有疑问,请立即添加模式。如果将来您/您的队友对您的代码感到困惑,请在那时将其删除。