当您只有3种情况且每种情况的逻辑都很简单时,可以接受的答案很好。
但是,如果每种情况的逻辑更加复杂,或者存在更多的情况,那么更好的选择是使用责任链设计模式。
您创建一个BaseValidator
,其中包含对的引用,对BaseValidator
的方法validate
以及在引用的验证器上调用验证的方法。
class BaseValidator {
BaseValidator* nextValidator;
public:
BaseValidator() {
nextValidator = 0;
}
void link(BaseValidator validator) {
if (nextValidator) {
nextValidator->link(validator);
} else {
nextValidator = validator;
}
}
bool callLinkedValidator(bool v1, bool v2, bool v3, bool v4) {
if (nextValidator) {
return nextValidator->validate(v1, v2, v3, v4);
}
return false;
}
virtual bool validate(bool v1, bool v2, bool v3, bool v4) {
return false;
}
}
然后,您创建了许多继承自的子类,并使用每个验证器所必需的逻辑BaseValidator
覆盖了validate
方法。
class Validator1: public BaseValidator {
public:
bool validate(bool v1, bool v2, bool v3, bool v4) {
if (v1 && v2 && v3 && v4) {
return true;
}
return nextValidator->callLinkedValidator(v1, v2, v3, v4);
}
}
然后使用它很简单,实例化每个验证器,并将每个验证器设置为其他验证器的根:
Validator1 firstValidator = new Validator1();
Validator2 secondValidator = new Validator2();
Validator3 thirdValidator = new Validator3();
firstValidator.link(secondValidator);
firstValidator.link(thirdValidator);
if (firstValidator.validate(value1, value2, value3, value4)) { ... }
本质上,每个验证的情况下具有其自己的类,这是负责(a)确定如果验证匹配该案例,以及(b)将验证发送给链中其他人()。
请注意,我对C ++不熟悉。我已经尝试从网上找到的一些示例中匹配语法,但是如果这样做不起作用,请更像伪代码一样对待它。我下面还有一个完整的可运行Python示例,如果愿意,可以用作基础。
class BaseValidator:
def __init__(self):
self.nextValidator = 0
def link(self, validator):
if (self.nextValidator):
self.nextValidator.link(validator)
else:
self.nextValidator = validator
def callLinkedValidator(self, v1, v2, v3, v4):
if (self.nextValidator):
return self.nextValidator.validate(v1, v2, v3, v4)
return False
def validate(self, v1, v2, v3, v4):
return False
class Validator1(BaseValidator):
def validate(self, v1, v2, v3, v4):
if (v1 and v2 and v3 and v4):
return True
return self.callLinkedValidator(v1, v2, v3, v4)
class Validator2(BaseValidator):
def validate(self, v1, v2, v3, v4):
if (v1 and v2 and v3 and not v4):
return True
return self.callLinkedValidator(v1, v2, v3, v4)
class Validator3(BaseValidator):
def validate(self, v1, v2, v3, v4):
if (v1 and not v2 and not v3 and not v4):
return True
return self.callLinkedValidator(v1, v2, v3, v4)
firstValidator = Validator1()
secondValidator = Validator2()
thirdValidator = Validator3()
firstValidator.link(secondValidator)
firstValidator.link(thirdValidator)
print(firstValidator.validate(False, False, True, False))
同样,对于您的特定示例,您可能会发现这种矫kill过正的做法,但是如果最终遇到了需要解决的更为复杂的情况,它会创建更简洁的代码。
if
语句。另外,由于这些是布尔标志,因此您可以将每个方案建模为一个常量,然后对其进行检查。