使用场景
在项目中我们经常会有不同方式去处理某些业务,比如处理对账文件、处理不同报文、处理不同规则订单等等,总之每种业务场景都有其特殊要求,这时使用大量if else 代码的扩展性不是很好,这时可以考虑策略模式来去处理。
1. 定义策略接口
public interface BankFileStrategy {
// 处理文件,入参和返回值可根据实际业务自己定义
void processFile(String date);
}
2. 列举两个解析文件具体策略实现
@Service("ICBC")
public class ICBCFileServiceImpl implements BankFileStrategy {
@Override
public void processFile(String date) {
// 模拟业务处理
System.out.println(date + "开始处理ICBC银行文件....");
}
}
@Service("ABC")
public class ABCFileServiceImpl implements BankFileStrategy {
@Override
public void processFile(String date) {
// 模拟业务处理
System.out.println(date + "开始处理ABC银行文件....");
}
}
3.定义策略上下文
public class BankFileContextStrategy {
// 持有一个策略的引用
private BankFileStrategy bankFileStrategy;
// 使用构造器注入具体的策略类
public BankFileContextStrategy(BankFileStrategy strategy) {
this.bankFileStrategy = strategy;
}
// 调用执行策略业务方法
public void handle(String date) {
bankFileStrategy.processFile(date);
}
}
4.后端对外提供调用接口
@RestController
public class FileController {
// spring容器获取所有策略实现,map的key对应@Service 设置的bean 名称
@Autowired
private Map<String, BankFileStrategy> bankFileStrategyMap;
// 根据传入的银行编码,处理不同银行文件
@GetMapping("/test/{bankCode}")
public String processFile(@PathVariable(value = "bankCode") String bank) {
BankFileStrategy bankFileStrategy = bankFileStrategyMap.get(bank);
if (bankFileStrategy != null) {
BankFileContextStrategy contextStrategy = new BankFileContextStrategy(bankFileStrategy);
contextStrategy.handle("2022-07-29");
return "文件解析完成";
} else {
return "不支持的文件解析";
}
}
}