Heim  >  Artikel  >  Java  >  So beseitigen Sie Switch-Case in Springboot

So beseitigen Sie Switch-Case in Springboot

王林
王林nach vorne
2023-05-14 19:49:041014Durchsuche

Die Grundlogik lautet wie folgt:

 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:
    }

Nachdem Sie es geschrieben haben, werden Sie feststellen, dass dieser Code mit zunehmender Anzahl von Ereignissen sehr lang wird und die Verarbeitungsfunktionen jedes einzelnen Auch die Konzentration von Ereignissen auf eine Klasse ist schwierig aufrechtzuerhalten. Daher haben wir durch Suchen und Lernen herausgefunden, dass wir Springboots Anmerkungen + Strategiemodus + einfache Fabrik verwenden können, um Switch-Case zu eliminieren.

Refactoring

Struktur definieren

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;
  }
}

Annotation definieren# 🎜🎜 #

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface CRSEventAnnotation {

  CRSEvent value();
}
Ereignisverarbeitungsschnittstelle definieren


public interface EventProcess {
  CRSResponse execute(CRSRequest resquest);
}
Alle Zeitverarbeitungsklassen müssen diese Schnittstelle implementieren. Darunter ist die Ausführung die Ereignisverarbeitungsmethode

Schreiben Sie eine bestimmte Zeitverarbeitungsklasse

Als nächstes schreiben Sie die Ereignisverarbeitung nacheinander Eine Klasse, nehmen Sie das folgende Beispiel:

@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-Toolklasse definieren


@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;
  }
}
Ereignisverarbeitungsklassenfabrik definieren, um verschiedene Ereignisverarbeitungsobjekte zu erzeugen#🎜🎜 ## 🎜🎜#
@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);
  }
}

Codeänderung aufrufen

 CRSEvent crsEvent = CRSEvent.valueOf(crsRequest.getEvent());
 EventProcess eventProcess = EventProcessFactory.createEventProcess(crsEvent);
 if (eventProcess != null){
   return eventProcess.execute(crsRequest);
 }
return null;

Auf diese Weise muss der Code nicht umgeschaltet werden, und das Hinzufügen eines Ereignisses ist ebenfalls sehr einfach Implementieren Sie die EventProcess-Schnittstelle.

Das obige ist der detaillierte Inhalt vonSo beseitigen Sie Switch-Case in Springboot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen