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(){
Mapmap=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策略模式的资料请关注毛票票其它相关文章!