使用策略者模式+反射简化大量if-else

使用策略者模式+反射简化大量if-else

if else 代码量增多,修改的时候还得小心翼翼,其实每个if else 里面都相当于一个策略。

适用场景

大量的 if else代码

代码例子

场景描述

如同:

平常经常遇到if else,如:
if(a == 1){
	//dosomething
}else if(a == 2){
	//dosomething
} else{
	//dosomething
}

以上述为例:将上面的代码替换为策略者模式

代码

1.定义接口ExcuteInterface ,用于处理业务逻辑
代码:

public interface ExcuteInterface {
    public void doSomething(Map map);
}

注意:为什么入参为map?因为doSomething定义为没有返回值,我们业务逻辑本身就很复杂,可以细分为“有反参”、“无反参”两种情况,“无反参”没问题,“有反参”的话就将反参放入map中等方法执行完,再从map中取即可。(此处若可优化,请留言)

2.定义策略ExcuteA、ExcuteB、ExcuteElse,分别代表“a == 1” 、“a == 2”、“else”这三种场景
代码:

public class ExcuteA implements ExcuteInterface {

    @Override
    public void doSomething(Map map) {
        System.out.println("do A .... a=1的逻辑");
    }
}
public class ExcuteB implements ExcuteInterface {
    @Override
    public void doSomething(Map map) {
        System.out.println("do B.... a=2的逻辑");
    }
}
public class ExcuteElse implements ExcuteInterface {
    @Override
    public void doSomething(Map map) {
        System.out.println("do Else.... a=ohter的逻辑");

    }
}

3.定义适配器ExcuteAdapter用于适配上面三个策略的

public class ExcuteAdapter {
    Map map = new HashMap();

    public ExcuteAdapter(){
        map.put(1,"adapterA");
        map.put(2,"adapterB");
        map.put(3,"adapterElse");
    }

    public  ExcuteInterface adapterA(){
        return new ExcuteA();
    }
    public  ExcuteInterface adapterB(){
        return new ExcuteB();
    }
    public  ExcuteInterface adapterElse(){
        return new ExcuteElse();
    }

    public ExcuteInterface incokeMehtod(int value) throws Exception {
        ExcuteInterface ee = null;
        if(this.map.containsKey(value)){
            Class clzz = this.getClass();
            try {
                Method m = clzz.getMethod(this.map.get(value).toString());
                ee = (ExcuteInterface)m.invoke(this);
            } catch (Exception e) {
                e.printStackTrace();
                throw new Exception("出错了!");
            }
        }else{
            throw new Exception("无效的值");
        }
        return ee;
    }
}

value:这个是我们的可变参数,用于确定我们调用的方法——adapterA?adapterB还是adapterElse?

测试类:

public class Test {
    public static void main(String[] args){
        try{
            Test.test(1);
            Test.test(2);
            Test.test(3);

        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void test(Integer value) throws Exception{
        ExcuteAdapter adapter = new ExcuteAdapter();
        ExcuteInterface ee =  adapter.incokeMehtod(value);
        ee.doSomething(new HashMap());
    }
}

运行结果:

do A .... a=1的逻辑
do B.... a=2的逻辑
do Else.... a=ohter的逻辑

测试通过!

优缺点

优点:解耦合,每个分支都相当于一个策略,各个分支相互独立,互不影响。
缺点:工作量增大,增加一个策略需要增加一个策略类,并且在ExcuteAdapter 类的map中增加映射、ExcuteAdapter 类增加方法。一共要修改2处,增加一处;效率方面上有所降低,毕竟类加载,你懂的,但效率影响的并不是很大。

总结

在if else 少的情况下千万别用,谁没事找事啊;多的情况下再用吧,毕竟大量的if else太让人抓狂了!

代码下载

github:https://github.com/liujinleisir/javaTest/tree/master/src/test23designmode/行为型模式/策略模式/killifandelse

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章