据我所知,这是一个级联步骤的示例,如果第一个和第一个和第二个有效,则将执行第二个和第三个步骤,即返回 hasFailed==false。
使用模板方法和装饰器设计模式可以使这段代码更加优雅。
你需要一个接口、具体实现、抽象类和抽象类的几个子类。
public interface Validator {
public boolean isValid();
}
public class GetNewOrders implements Validator {
public boolean isValid() {
// same code as your GetNewOrders method
}
}
public abstract class AbstractValidator implements Validator {
private final Validator validator;
public AbstractValidator(Validator validator) {
this.validator = validator;
}
protected boolean predicate();
protected boolean isInvalid();
public final boolean isValid() {
if (!this.validator.isValid() && predicate() && isInvalid())
return false;
return true;
}
}
public class CheckInventory extends AbstractValidator {
public CheckInventory(Validator validator) {
super(validator);
}
@Override
public boolean predicate() {
return true;
}
@Override
public boolean isInvalid() {
// same code as your CheckInventory method
}
}
public class PreOrder extends AbstractValidator {
public CheckInventory(Validator validator) {
super(validator);
}
@Override
public boolean predicate() {
return true;
}
@Override
public boolean isInvalid() {
// same code as your PreOrder method
}
}
现在您的方法看起来更加优雅:
public void MyMethod() {
bool success = false;
try {
Validator validator = new GetNewOrders();
validator = new CheckInventory(validator);
validator = new PreOrder(validator);
success = validator.isValid();
} finally {
if (!success) {
// do something
}
}
}
Validator 对象可以在一行中创建,但我更喜欢这种样式,因为它使验证的顺序很明显。在链中创建新的验证链接是继承 AbstractValidator 类和实现谓词和 isInvalid 方法的问题。