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