概述
文章目录
- 使用策略者模式+反射简化大量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
最后
以上就是拼搏大船为你收集整理的使用策略者模式+反射简化大量if-else使用策略者模式+反射简化大量if-else的全部内容,希望文章能够帮你解决使用策略者模式+反射简化大量if-else使用策略者模式+反射简化大量if-else所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复