使用策略者模式+反射簡化大量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

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