一个接口多实现类、策略工厂模式
文章目录步骤1、定义接口ExcelProcessService2、创建工厂3、功能1(用户功能)实现类纯手动装配(仅供对比)最典型的场景就是导入导出导入导出是通用功能每个模块都可能用到比较呆的写法就是每个模块单独写每新增一个功能都要写一份费时费力还不优雅。推荐的方式是策略工厂模式维护起来方便新增功能只需维护少量代码。步骤1、定义接口ExcelProcessServicepublicinterfaceExcelProcessService{/** * 执行Excel导入逻辑 * param funcName 功能名称用于匹配具体的策略实现类 */voidimportData(StringfuncName);/** * 执行Excel导出逻辑 * param funcName 功能名称用于匹配具体的策略实现类 */voidexportData(StringfuncName);}2、创建工厂这里是隐式写法利用的是spring的自动装配原理。importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.util.Map;ComponentpublicclassExcelProcessFactory{// Spring 会自动把所有 ExcelProcessService 的实现类收集到这个 Map 里// Key 就是 Service(xxx) 中定义的名字Value 就是具体的实现类实例AutowiredprivateMapString,ExcelProcessServicestrategyMap;/** * 根据功能名称获取对应的处理策略 * param funcName 功能名称必须和实现类 Service 里的名字一致 * return 对应的 ExcelProcessService 实例 */publicExcelProcessServicegetStrategy(StringfuncName){ExcelProcessServiceservicestrategyMap.get(funcName);if(servicenull){thrownewIllegalArgumentException(未找到对应的功能实现: funcName);}returnservice;}}3、功能1(用户功能)实现类后续再有多个功能按照这个模式维护即可。在调用时只需要传入功能名。importorg.springframework.stereotype.Service;// 这里的 user_excel 就是 funcName功能名Service(user_excel)publicclassUserExcelProcessServiceimplementsExcelProcessService{OverridepublicvoidimportData(StringfuncName){// 这里写用户导入的具体逻辑System.out.println(正在执行【用户数据】的 Excel 导入逻辑...);}OverridepublicvoidexportData(StringfuncName){// 这里写用户导出的具体逻辑System.out.println(正在执行【用户数据】的 Excel 导出逻辑...);}}纯手动装配(仅供对比)纯手工装配就是维护一个静态map然后手动往里写不如自动装配方便。还有一种半手工也不如自动装配优雅这里就不展示了。importjava.util.HashMap;importjava.util.Map;publicclassExcelProcessFactory{// 1. 自己定义一个静态的 MapprivatestaticfinalMapString,ExcelProcessServiceSTRATEGY_MAPnewHashMap();// 2. 在静态代码块中手动注册装配策略static{// 手动 new 出实现类并 put 进 Map 中STRATEGY_MAP.put(user_excel,newUserExcelProcessService());// 以后如果有订单继续往下写// STRATEGY_MAP.put(order_excel, new OrderExcelProcessService());}// 3. 提供获取策略的方法publicstaticExcelProcessServicegetStrategy(StringfuncName){ExcelProcessServiceserviceSTRATEGY_MAP.get(funcName);if(servicenull){thrownewIllegalArgumentException(未找到对应的功能实现: funcName);}returnservice;}}