您好,欢迎访问一九零五行业门户网

Springboot中如何消除switch-case

基本逻辑如下:
string event = crsrequest.getevent();    crsresponse crsresponse = null;    switch (event) {      case crsrequestevent.app_start:        crsresponse = processappstartcommand(crsrequest);        break;      case crsrequestevent.init_complete:        crsresponse = processinitcompletecommand(crsrequest);        break;      case crsrequestevent.collect_complete:        crsresponse = processcollectcompletecommand(crsrequest);        break;      case crsrequestevent.collect_no_input:        crsresponse = processcollectnoinputcommand(crsrequest);        break;      case crsrequestevent.play_complete:        crsresponse = processplaycompletecommand(crsrequest);        break;      default:    }
写完会发现,随着事件的增加,这段代码会很长,每个事件的处理函数也都集中在一个类当中,不好维护。因此,通过搜索学习发现,可以使用springboot的注解+策略模式+简单工厂的方式来消除switch-case。
重构
定义结构体
public enum crsevent {  app_start(app_start),  init_complete(init_complete),  play_complete(play_complete),  collect_complete(collect_complete),  collect_no_input(collect_no_input),  app_end(app_end),  resp_error_cmd(resp_error_cmd);  private string event;  crsevent(string event){    this.event = event;  }    public string getevent() {    return event;  }  public void setevent(string event) {    this.event = event;  }}
定义一个注解
@target(elementtype.type)@retention(retentionpolicy.runtime)public @interface crseventannotation {  crsevent value();}
定义事件处理接口
public interface eventprocess {  crsresponse execute(crsrequest resquest);}
所有的时间处理类都要实现这个接口。其中,execute是事件的处理方法
编写具体的时间处理类
接下来,逐个的编写事件处理类,举下面一个例子:
@component(appstartprocess)@crseventannotation(value = crsevent.app_start)public class appstartprocess implements eventprocess{  @override  public crsresponse execute(crsrequest resquest) {    crsresponse response = new crsresponse();    response.setcommand(crsresponsecmd.ivr_session_init);    crsresponse.message message = new crsresponse.message();    message.settts_vid(65580);    message.settts_speed(120);    response.setmessage(message);    return response;  }}
定义springcontext工具类
@componentpublic class springcontextutil implements applicationcontextaware{  private applicationcontext context;  public applicationcontext getcontext(){    return context;  }  @override  public void setapplicationcontext(applicationcontext applicationcontext) throws beansexception {    this.context = applicationcontext;  }}
定义事件处理类工厂,用来生产各种事件处理对象
@componentpublic class eventprocessfactory {  @autowired  springcontextutil contextutil;  private static map<crsevent, eventprocess> eventprocessmap = new concurrenthashmap<>();  public eventprocessfactory() {    map<string, object> beanmap = contextutil.getcontext().getbeanswithannotation(crseventannotation.class);    for (object evetprocess : beanmap.values()) {      crseventannotation annotation = evetprocess.getclass().getannotation(crseventannotation.class);      eventprocessmap.put(annotation.value(), (eventprocess) evetprocess);    }  }    public static eventprocess createeventprocess(crsevent event){    return eventprocessmap.get(event);  }}
调用代码修改
crsevent crsevent = crsevent.valueof(crsrequest.getevent()); eventprocess eventprocess = eventprocessfactory.createeventprocess(crsevent); if (eventprocess != null){   return eventprocess.execute(crsrequest); }return null;
这样,代码就没有了switch-case,增加一个事件也很简单,只需要实现eventprocess接口即可。
以上就是springboot中如何消除switch-case的详细内容。
其它类似信息

推荐信息