中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot消除switch-case的過程解析

發布時間:2021-09-14 22:59:16 來源:億速云 閱讀:123 作者:chen 欄目:編程語言

本篇內容介紹了“Springboot消除switch-case的過程解析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

背景

最近,在使用springboot開發一個接口的時候,需要根據接收的請求事件類型,去執行不同的操作,返回不同的結果,基本邏輯如下:

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的過程解析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡阳县| 乐亭县| 疏附县| 汝南县| 万州区| 平江县| 上虞市| 策勒县| 云南省| 仙桃市| 专栏| 新和县| 衡阳市| 潜山县| 尼玛县| 周口市| 水富县| 上高县| 台东市| 沈丘县| 佛冈县| 宜川县| 宁武县| 武义县| 全南县| 常宁市| 宜城市| 莒南县| 醴陵市| 上杭县| 分宜县| 安平县| 禄劝| 岳阳县| 乌拉特后旗| 积石山| 江阴市| 桃园市| 朔州市| 拜城县| 枣阳市|