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工具類別
@Component public class SpringContextUtil implements ApplicationContextAware{ private ApplicationContext context; public ApplicationContext getContext(){ return context; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } }
定義事件處理類別工廠,用來生產各種事件處理物件
@Component public 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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

switch日版港版的區別:1、充電器上存在主要區別,日版和國標充電口通用,港版使用英式三角插頭;2、日版使用點卡支付,而港服使用支付寶支付;3 、港版售後保固需郵寄回HK售後點,而日版需郵寄至Japan指定售後點。

艾爾登法環能在switch上游玩嗎?艾爾登法環作為一款極具魅力的動作RPG遊戲,不少朋友可能還不明白它能否在switch平台上進行暢快遊玩,答案是暫時無法實現。艾爾登法環switch能玩麼答:不能在switch遊玩。此款備受矚目的魂系列角色扮演動作遊戲已正式發布,玩家可前往PC、ps4/5以及XboxSerieseX|S/XboxOne購買並立即體驗。許多擁有switch的朋友們可能仍熱切期待在ns上暢享這款遊戲,但遺憾的說,該遊戲並無switch版本。據官網配置要求顯示,遊戲配置較高,而sw

switch32g記憶體不夠用,原因如下:1、買數位版遊戲想買DLC截圖儲存到掌機裡的話根本不夠用;2、下載數位版遊戲,32G記憶體大約可以儲存2~3個遊戲,根本滿足不了玩遊戲的需求;3、數位遊戲及其dlc一般保持在5G,除過自備系統佔用的空間,下載遊戲對玩家來說比較困難。

switch連電視沒反應解決方法:1.檢查switch和電視的電源是否連接;2、檢查電視HDMI線接口是否插緊;3、Switch底座後蓋打開,檢查電源線和HDMI線是否插緊;4、檢查Switch是否開機狀態放入底座;5、檢查電視是否切換了訊號源。

SpringBoot和SpringMVC都是Java開發中常用的框架,但它們之間有一些明顯的差異。本文將探究這兩個框架的特點和用途,並對它們的差異進行比較。首先,我們來了解一下SpringBoot。 SpringBoot是由Pivotal團隊開發的,它旨在簡化基於Spring框架的應用程式的建立和部署。它提供了一種快速、輕量級的方式來建立獨立的、可執行

本文來寫個詳細的例子來說下dubbo+nacos+Spring Boot開發實戰。本文不會講述太多的理論的知識,會寫一個最簡單的例子來說明dubbo如何與nacos整合,快速建構開發環境。

switch lite和switch區別有:1、尺寸不同;2、螢幕大小及機身重量不同;3、手柄是否可拆卸及手柄功能不同;4、電池續航能力不同;5、手柄按鍵設計不同;6、可支援遊戲不同;6、顏色不同。
