首頁 Java java教程 Springboot中如何消除switch-case

Springboot中如何消除switch-case

May 14, 2023 pm 07:49 PM
switch springboot 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1248
24
switch日版港版有什麼差別 switch日版港版有什麼差別 Jun 20, 2023 pm 02:06 PM

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

艾爾登法環switch能玩麼 艾爾登法環switch能玩麼 Mar 11, 2024 am 11:31 AM

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

switch可以一直放在底座上充電嗎 switch可以一直放在底座上充電嗎 Jul 06, 2023 pm 04:51 PM

switch不可以一直放在底座上充電,其危害有:1、縮短電池的壽命和續航時間;2、導致記憶體燒壞。

switch32g內存夠用嗎 switch32g內存夠用嗎 Jun 20, 2023 pm 02:28 PM

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

switch連電視沒反應怎麼辦 switch連電視沒反應怎麼辦 Jul 03, 2023 am 11:15 AM

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

SpringBoot與SpringMVC的比較及差別分析 SpringBoot與SpringMVC的比較及差別分析 Dec 29, 2023 am 11:02 AM

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

SpringBoot+Dubbo+Nacos 開發實戰教程 SpringBoot+Dubbo+Nacos 開發實戰教程 Aug 15, 2023 pm 04:49 PM

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

switch lite和switch有什麼區別 switch lite和switch有什麼區別 Jun 28, 2023 pm 02:13 PM

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

See all articles