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

Bagaimana untuk menghapuskan suis-case dalam Springboot

王林
Lepaskan: 2023-05-14 19:49:04
ke hadapan
1095 orang telah melayarinya

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:
    }
Salin selepas log masuk

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;
  }
}
Salin selepas log masuk

Tentukan anotasi

rreee

Definisi Pemprosesan acara antara muka

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

  CRSEvent value();
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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;
  }
}
Salin selepas log masuk

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;
  }
}
Salin selepas log masuk

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);
  }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan