通过设计模式,删除 if else 语句,提高代码的可读性和可维护性
github 地址
publicclassOrderHandle {/** * 无设计模式 */publicvoidgenerateOrder(StringorderType) {if ("ordinary".equals(orderType)) {System.out.println("生成普通订单"); }elseif ("group".equals(orderType)) {System.out.println("生成团购订单"); }elseif ("promotion".equals(orderType)) {System.out.println("暂不支持促销订单"); } }}// 使用StringorderType ="group";OrderHandleorderHandle =newOrderHandle();orderHandle.generateOrder(orderType);
github
publicclassStaticStrategyFactory {staticMap<String,AbstractOrderHandle>strategyMap =newHashMap<>();publicstaticAbstractOrderHandlegetStrategy(Stringtype) {returnstrategyMap.get(type); }publicstaticvoidregister(Stringtype,AbstractOrderHandlehandle) {strategyMap.put(type,handle); }}
publicabstractclassAbstractOrderHandleimplementsInitializingBean {publicvoidgenerateOrder() {thrownewUnsupportedOperationException("暂不支持生成该类型订单"); }}
@ComponentpublicclassGroupOrderHandleextendsAbstractOrderHandle {publicvoidgenerateOrder() {System.out.println("生成团购订单"); }@OverridepublicvoidafterPropertiesSet()throwsException {StaticStrategyFactory.register(OrderEnum.GROUP.getCode(),this); }}
@TestvoidtestOrdinaryOrder() {StaticStrategyFactory.getStrategy(OrderEnum.ORDINARY.getCode()).generateOrder();}
github
@ComponentpublicclassAutoInjectStrategyFactory {@ResourcepublicList<AbstractPlatformStrategy>platformStrategyList;privatefinalMap<String,AbstractPlatformStrategy>strategyMap =newHashMap<>();@PostConstructpublicvoidregistered() {platformStrategyList.forEach(strategy ->strategyMap.put(strategy.getPlatform(),strategy)); }publicAbstractPlatformStrategygetStrategy(Stringplatform) {returnstrategyMap.get(platform); }}
publicabstractclassAbstractPlatformStrategyimplementsIPlatform {publicvoidhandlePlatform() {thrownewUnsupportedOperationException("暂不支持处理该平台"); }}publicinterfaceIPlatform {StringgetPlatform();}
@ServicepublicclassJDPlatformStrategyextendsAbstractPlatformStrategy {@OverridepublicvoidhandlePlatform() {System.out.println("处理京东平台"); }@OverridepublicStringgetPlatform() {returnPlatformEnum.JD.getPlatform(); }}
@TestvoidtestJDPlatform() {autoInjectStrategyFactory.getStrategy(PlatformEnum.JD.getPlatform()).handlePlatform();}
github
publicenumWorkOrderEnumFactory {CONSTRUCTION("construction","施工工单",ConstructionStrategy.class),MAINTENANCE("maintenance","维修工单",MaintenanceStrategy.class);privateStringcode;privateStringdesc;privateClass<?>strategyClass;WorkOrderEnumFactory(Stringcode,Stringdesc,Class<?>strategyClass) {this.code =code;this.desc =desc;this.strategyClass =strategyClass; }publicStringgetCode() {returncode; }publicStringgetDesc() {returndesc; }publicClass<?>getStrategyClass() {returnstrategyClass; }publicstaticIWorkOrderStrategygetStrategy(Stringcode) {for (WorkOrderEnumFactoryworkOrderEnumFactory :WorkOrderEnumFactory.values()) {if (Objects.equals(workOrderEnumFactory.getCode(),code)) {return (IWorkOrderStrategy)SpringContextUtils.getBean(workOrderEnumFactory.getStrategyClass()); } }thrownewRuntimeException(); }}
@ServicepublicclassConstructionStrategyimplementsIWorkOrderStrategy {publicvoidgenerateWorkOrder() {System.out.println("生成施工工单"); }}
@TestvoidtestConstructionWorkOrder() {WorkOrderEnumFactory.getStrategy(WorkOrderEnumFactory.CONSTRUCTION.getCode()).generateWorkOrder();}