在编码中难免遇到if else过多情况,一方面是当初设计没有在意,另一方面可能是因为需求的不断变化。但代码中出现大量if else都知道这种情况不太好,那么我们就聊一下这种情况应该如何优化
if(条件1){
....
}else if(条件2){
....
}else if(条件3){
....
}else{
....
}
1.表驱动
表驱动是指用查表的方式获取值
private static Map<Status, Function<Integer, Integer>> conditions;
static {
conditions = new HashMap<>();
conditions.put(Status.CONDITION1,(t)->{
return t+1;
});
conditions.put(Status.CONDITION2,(t)->{
return t+2;
});
}
@Test
public void test(){
Integer apply = conditions.get(Status.CONDITION1).apply(1);
System.out.println(apply);
}
enum Status{
CONDITION1,CONDITION2;
}
2.责任链模式
当判断条件复杂多变时,就无法使用上述的驱动表了。
责任链使用比较多的场景比如:Filter、Interceptor。
abstract class Handler {
protected Handler next;
public void setNext(Handler next) { // 设置下一个处理者
this.next = next;
}
public abstract void handlerRequest(int request); // 请求处理逻辑
}
class ConcreteHandler1 extends Handler {
@Override
public void handlerRequest(int request) {
if (request >= 0) {
System.out.println("request >= 0");
} else {
// 如果不满足条件进行下一次
next.handlerRequest(request); // 将请求发送给下一位
}
}
}
class ConcreteHandler2 extends Handler {
@Override
public void handlerRequest(int request) {
if (request >= 10) {
System.out.println("request >= 10");
} else {
// 如果不满足条件进行下一次
next.handlerRequest(request); // 将请求发送给下一位
}
}
}
public class TestHandler {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
// 设置责任链的下家
handler1.setNext(handler2);
handler1.handlerRequest(8);
}
}
来源:51CTO
作者:石小令
链接:https://blog.51cto.com/13733462/2484881