我正在使用许多if语句进行检查。就像:
if(statement 1){
block 1;
}
if(statement 2){
block 2;
}
...//about at least 20 if
if(statement n){
block n;
}
为避免使用过多的if语句,我尝试使用策略模式,该策略模式将为每个if语句创建验证器类。
public interface Validator<SomeObejct>{
public Result validate(SomeObject o);
}
public class SomeValidator implements Validator<SomeObject> {
@Override
public boolean validate(SomeObject o) throw Exception{
if(statement 1){
block 1;
}
}
因为我可能至少有20个if语句,所以可能至少需要20个验证器类。那么,是否有更好的解决方案?或者我该如何管理这20个验证器类?
编辑:
更具体地说,我正在编写一些代码以按计划检查问题。例如:
if(currentDate > mustFinishDate){
warning();
}
if(NotScheduleADateForThisTask){
warning();
}
if(DateFormatNotCorrect){
error();
}
日期检查以上也可能是if语句块。
答案 0 :(得分:3)
您可以使用Composite模式来维护所有验证器的列表:
class ValidatorComposite<T> implements Validator<T> {
List<Validator<T>> validators = new ArrayList<>();
public void addValidator(Validator<T> add) { validators.add(add)); }
public Result validate(T toValidate) {
Result result = Result.OK;
for (Validator<T> v : validators) {
result = v.validate(toValidate);
if (result != Result.OK) break;
}
return result;
}
}
并且由于Validator
仅具有一种方法,对于Java 8来说,它是一个功能接口,因此您实际上并不需要“ 20个类”,而是可以使用lambda即时创建一个列表。
ValidatorComposite<SomeObject> val = new ValidatorComposite<>();
val.addValidator(so -> condition1 ? block1(so) : Result.OK);
val.addValidator(so -> condition2 ? block2(so) : Result.OK);
以此类推。
您的代码示例并不完全一致,因为首先您声明Validator
返回Result
,然后让实现返回boolean
(甚至抛出Exception
),因此我通过忽略异常和使用Result.OK
值来进行整合。
答案 1 :(得分:1)
所以我相信,如果编写20 ifs
会使您的代码更容易理解和更灵活,那么实现起来就不错。
顺便说一句,您也可以使用switch case
。
switch (variable){
case 1:{
//block 1
}
case 2:{
//block2
}
...
}
如果您的案例不相似,并且使用Validator
模式具有不同的方面,则会导致僵化(可能会导致这一点,取决于情况)。