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

Chr*_*311 9 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

switch语句的示例

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 8

因为在一系列责任中,您不需要知道谁在调用者中做了什么.决定何时在链中运行您的代码的逻辑由您拥有,其余代码可以忽略它.这允许将特定逻辑封装在正确的位置.Servlet过滤器就是一个很好的例子