没有什么好的设计方式可以实现,减少一个方法中出现几十个 if 匹配的判断?
现在要做一个判断客户是否通过验证的接口。
一共有30多个验证规则的判断, 每个规则对应一个规则号;
这个接口只需要返回是否验证通过 接口参数是一个数组,数组里面放入的是需要验证哪些规则的规则号;
我想到的比较原始的方法可能是
/**
* 验证客户是否通过验证
* @param rules 需要验证的多条规则的对应码的数组
/
public boolean checkPass(int[] rules){
boolean isPass = true;
for(int rule:rules){
if(!isPass){
break;//前一项不通过直接结束;
}
if(1==rule){
isPass = doCheck_1();
}
if(2==rule){
isPass = doCheck_2();
}
if(3==rule){
isPass = doCheck_3();
}
/
*
*/
if(39==rule){
isPass = doCheck_39();
}
}
return isPass;
}
但是这样代码写出来圈复杂度肯定超的不知道哪去了。。。
请教大家有什么方法或是用什么设计模式解决这样的问题比较好?
changchang 写道
可以通过map的方式来对这种if-else的情况进行解偶。
用一个接口把验证操作抽象出来。
public interface CheckRule {
public boolean doCheck();
}
然后定义具体的验证规则类实现这个接口:
public class CheckRule1 implements CheckRule {
public boolean doCheck() {
//doCheck1
...
}
}
在验证服务类初始化的时候,建立起一个规则号到规则类的映射。
Map rules = new HashMap();
rules.put(1, new CheckRule1());
这工作部分可以放在配置文件(如,spring)中完成,这样以后需要增减修改规则的时候会比较方便。
最后把checkPass改写一下就可以了。
public boolean checkPass(int[] ruleCodes){
for(int ruleCode : ruleCodes) {
if(!rules.get(ruleCode).doCheck()) {
return false;
}
}
return true;
}