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
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!