Rumah  >  Artikel  >  Java  >  Bagaimana untuk menghapuskan suis-case dalam Springboot

Bagaimana untuk menghapuskan suis-case dalam Springboot

王林
王林ke hadapan
2023-05-14 19:49:041018semak imbas

Logik asas adalah seperti berikut:

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

Selepas menulisnya, anda akan mendapati bahawa apabila peristiwa meningkat, kod ini akan menjadi sangat panjang, dan fungsi pemprosesan setiap peristiwa juga tertumpu dalam satu kelas mudah diselenggara. Oleh itu, melalui carian dan pembelajaran, kami mendapati bahawa kami boleh menggunakan anotasi Springboot + mod strategi + kilang mudah untuk menghapuskan suis-case.

Refactor

Takrif struktur

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

Tentukan anotasi

rreee

Definisi Pemprosesan acara antara muka

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

  CRSEvent value();
}

Setiap kelas pemprosesan masa mesti melaksanakan antara muka ini. Antaranya, laksanakan ialah kaedah pemprosesan acara

Tulis kelas pemprosesan masa tertentu

Seterusnya, tulis kelas pemprosesan acara satu persatu, berikan yang berikut contoh:

public interface EventProcess {
  CRSResponse execute(CRSRequest resquest);
}

Tentukan kelas alat SpringContext

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

Tentukan kilang kelas pemprosesan acara untuk menghasilkan pelbagai objek pemprosesan acara

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

Pengubahsuaian kod panggilan

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

Dengan cara ini, tiada kes suis dalam kod dan menambah acara juga sangat mudah Anda hanya perlu melaksanakan antara muka EventProcess.

Atas ialah kandungan terperinci Bagaimana untuk menghapuskan suis-case dalam Springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam