Java如何利用策略模式替代if/else语句
平时在开发中避免不了使用大量的ifelse语句,但过多层的ifelse对于性能有很大的开销,类似如下代码
publicclassMainStart{ publicstaticvoidmain(String[]args){ Stringmsgid="MS066"; if(message.equals("MS066")){ System.out.println("MS066"); }elseif(message.equals("MS034")){ System.out.println("MS034"); }elseif(message.equals("MS064")){ System.out.println("MS064"); }else{ System.out.println("nomsgid!"); } } }
上边代码只是示例,实际情况可能不止4层
策略模式是一种解耦的方法,它对算法进行封装,使得算法的调用和算法本身分离。使用策略模式客户端代码不需要调整,算法之间可以互相替换,因为不同的算法实现的是同一个接口。将上面的代码优化后变为:
publicclassMainStart{ publicstaticvoidmain(String[]args){OrderDictControllercontroller=newOrderDictController(); Stringmsgid="MS066"; MsgInterfacemsgInterface=MsgContext.getInstance(msgId);msgInterface.manage(msg,controller); } }
实现策略模式需要以下几个步骤:
1.定义接口
importjava.sql.SQLException; importorg.dom4j.DocumentException; importcom.huc.controller.OrderDictController; publicinterfaceMsgInterface{ publicvoidmanage(Stringmsg,OrderDictControllercontroller)throwsDocumentException,SQLException; }
2.实现接口,重写处理逻辑
packagecom.huc.msg.imp; importjava.sql.SQLException; importorg.dom4j.DocumentException; importcom.huc.controller.OrderDictController; importcom.huc.msg.MsgInterface; publicclassMS003implementsMsgInterface{ @Override publicvoidmanage(Stringmsg,OrderDictControllercontroller)throwsDocumentException,SQLException{ controller.manageMs003(msg); } }
packagecom.huc.msg.imp; importjava.sql.SQLException; importorg.dom4j.DocumentException; importcom.huc.controller.OrderDictController; importcom.huc.msg.MsgInterface; publicclassMS028implementsMsgInterface{ @Override publicvoidmanage(Stringmsg,OrderDictControllercontroller)throwsDocumentException,SQLException{ controller.manageMs028(msg); } }
写两个作为例子,可根据情况自行扩展实现类
3.定义策略上下文,根据msgid获取对象实例
packagecom.huc.msg; importjava.util.Map; publicclassMsgContext{ publicstaticMsgInterfacegetInstance(StringmsgId){ MsgInterfaceinter=null; MapallClazz=MsgEnum.getAllClazz(); Stringclazz=allClazz.get(msgId); if(msgId!=null&&msgId.trim().length()>0){ try{ try{ inter=(MsgInterface)Class.forName(clazz).newInstance();//调用无参构造器创建实例 }catch(InstantiationExceptione){ e.printStackTrace(); }catch(IllegalAccessExceptione){ e.printStackTrace(); } }catch(ClassNotFoundExceptione){ e.printStackTrace(); } } returninter; } }
在这一步骤中,我们需要一种方式可以根据msgid来反射获取对象的实例,这里使用枚举来维护二者的对应关系。
packagecom.huc.msg; importjava.util.HashMap; importjava.util.Map; publicenumMsgEnum{ MS066("MS066","com.huc.msg.imp.MS066"), MS034("MS034","com.huc.msg.imp.MS034"), MS064("MS064","com.huc.msg.imp.MS064"), MS028("MS028","com.huc.msg.imp.MS028"), MS003("MS003","com.huc.msg.imp.MS003"), MS062("MS062","com.huc.msg.imp.MS062"), MS154("MS154","com.huc.msg.imp.MS154"), MS153("MS153","com.huc.msg.imp.MS153"), MS033("MS033","com.huc.msg.imp.MS033"); privateStringmsgid; privateStringclazz; publicstaticMapgetAllClazz(){ Map map=newHashMap (); for(MsgEnummsgEnum:MsgEnum.values()){ map.put(msgEnum.getMsgid(),msgEnum.getClazz()); } returnmap; } MsgEnum(Stringmsgid,Stringclazz){ this.msgid=msgid; this.clazz=clazz; } publicStringgetMsgid(){ returnmsgid; } publicvoidsetMsgid(Stringmsgid){ this.msgid=msgid; } publicStringgetClazz(){ returnclazz; } publicvoidsetClazz(Stringclazz){ this.clazz=clazz; } }
在上面的代码中,getAllClazz()方法用于获取所有message和对应处理类的映射关系。至此策略模式优化就已经完成了,运行MainStart可以看到运行结果。
以上就是Java如何利用策略模式替代if/else语句的详细内容,更多关于Java策略模式的资料请关注毛票票其它相关文章!