基本逻辑如下:
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的详细内容。