为什么我要在 switch 语句上使用责任链
Why would I use a chain of responsibility over a switch-statement
假设您获得了多项验证。只有当要检查的对象属于特定类型时,这些验证才会生效。为什么我要在 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 创建验证器链。一个验证器看起来像
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 语句的示例
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
}
}
}
因为在责任链中,您不需要预先知道调用者中谁做了什么。决定何时 运行 你在链中的一段代码的逻辑归你所有,其余代码可以忽略它。这允许在正确的位置封装特定的逻辑。 Servlet 过滤器就是一个很好的例子
看起来使用责任链的理由很奇怪。您基本上只是在构建一个链来创建一个 if 语句的动态列表,这可能不是动态的,因为我确定您使用每个语句的一个验证器对链初始化进行了硬编码。
我认为责任链不是正确的模式。您应该将 if 语句替换为多态性。
例如,如果你有专门的 Statement
类,你可以只做 statement.validate()
。 Statement
如果你不想,它不必验证自己,它可以知道内部使用哪个验证器并将验证委托给它。
如果您没有专门的声明 类 您可以立即向工厂询问合适的验证器,而不是构建整个链。
假设您获得了多项验证。只有当要检查的对象属于特定类型时,这些验证才会生效。为什么我要在 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 创建验证器链。一个验证器看起来像
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 语句的示例
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
}
}
}
因为在责任链中,您不需要预先知道调用者中谁做了什么。决定何时 运行 你在链中的一段代码的逻辑归你所有,其余代码可以忽略它。这允许在正确的位置封装特定的逻辑。 Servlet 过滤器就是一个很好的例子
看起来使用责任链的理由很奇怪。您基本上只是在构建一个链来创建一个 if 语句的动态列表,这可能不是动态的,因为我确定您使用每个语句的一个验证器对链初始化进行了硬编码。
我认为责任链不是正确的模式。您应该将 if 语句替换为多态性。
例如,如果你有专门的 Statement
类,你可以只做 statement.validate()
。 Statement
如果你不想,它不必验证自己,它可以知道内部使用哪个验证器并将验证委托给它。
如果您没有专门的声明 类 您可以立即向工厂询问合适的验证器,而不是构建整个链。