为什么我会对switch语句使用一系列责任

时间:2015-10-19 14:44:21

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

考虑一下你有几个验证。只有在要检查的对象属于某种类型时,这些验证才会生效。为什么我会在switch语句中使用一系列责任?

责任链示例

public class Executor {

@Inject
private ValidatorFactory validatorFactory;

public void execute(Konfiguration konfig) {
    List<Statement> statements = konfig.getStatements();
    AbstractValidator validator = validatorFactory.create();
    for (Statement statement : statements) {
        if (validator.validate(statement.getType())) {
            crudService.execute(statement.getSql());
        }
    }
}

validatorFactory创建Validators链。一个验证器看起来像

public class AddPrimaryKeyValidator extends AbstractValidator {

@Override
public boolean validate(Statement statement) {
    if (SqlType.ADD_PK.getTyp().equals(statement.getType())) {
        return doesTableAndPrimaryKeyExist(statement.getTabName());
    }
    return successor.validate(statement);
}

使用switch-statement的示例

public void execute(Konfiguration konfig) {
    List<Statement> statements = konfig.getStatements();
    for (Statement statement : statements) {
        switch (statement.getType()) {
        case "ADD_PK":
            if (doesTableAndPrimaryKeyExist(statement.getTabName())) {
                frepCrudService.execute(statement.getSql());
            }
            // more cases
        }
    }
}

2 个答案:

答案 0 :(得分:8)

因为在责任链中,您不需要知道谁在呼叫者面前做了什么。决定何时在链中运行您的代码的逻辑由您拥有,其余代码可以忽略它。这允许将特定逻辑封装在正确的位置。 Servlet过滤器就是这个

的一个很好的例子

答案 1 :(得分:0)

使用一系列责任感似乎是一个奇怪的原因。您基本上只是构建一个链来创建if语句的动态列表,这可能不是动态的,因为我确信您使用每个语句一个验证器对链初始化进行了硬编码。

我认为责任链不是正确的模式。您应该通过多态替换if语句。

例如,如果您有专门的Statement课程,则可以statement.validate()。如果您不想要Statement,则不必验证自身,它只能知道在内部使用哪个验证器并将验证委托给它。

如果您没有专门的声明类,您可以立即向工厂询问正确的验证器,而不是构建整个链。

相关问题