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

标签 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
    }
}

最佳答案

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

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


是否应该用第二段代码替换第一段代码是另一个问题。对于像您当前拥有的代码一样简单的代码,添加设计模式可能有点矫枉过正。使用此模式的补充原因是:

  • if ... else block 的动态排列;
  • 添加新的处理 block ;
  • 将处理程序重新用作调度程序,能够向多个方向发送msg,形成责任树。<

  • 如果您的情况看起来需要设计模式,请继续。
  • 如果没有,就离开。
  • 如果您有疑问,请暂时添加模式。如果将来您发现您/您的团队成员对您的代码感到困惑,请在那时将其删除。

关于java - 责任链模式是否可以很好地替代一系列条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53684822/

相关文章:

java - 移除一个节点的所有子节点

java - 如何以编程方式绑定(bind)上下文特定的 JNDI 资源

c++ - 在 C++ 中实现通用构建器模式

c++ - 继承和重载默认构造函数

python - 只能从 python 中的类后代访问的方法

java - Java bean 的 setter 允许返回这个吗?

c# - 使用内存中的 sql lite 单元测试流利的 nhibernate 存储库 - 没有这样的表错误

java - PreparedStatement - 获取最后一个 ResultSet

java - 请注意文件名以及如何打印我从计算机中选择的文件名?

c# - 如何在 C# 中正确处理相关但不同类的调用方法