前言物流行业中 , 通常会涉及到EDI报文(XML格式文件)传输和回执接收 , 每发送一份EDI报文 , 后续都会收到与之关联的回执(标识该数据在第三方系统中的流转状态) 。
这里枚举几种回执类型:MT1101、MT2101、MT4101、MT8104、MT8105、MT9999 , 系统在收到不同的回执报文后 , 会执行对应的业务逻辑处理 。当然 , 实际业务场景并没有那么笼统 , 这里以回执处理为演示案例
模拟一个回执类
@Datapublic class Receipt { /** * 回执信息 */ String message; /** * 回执类型(`MT1101、MT2101、MT4101、MT8104、MT8105、MT9999`) */ String type;}
模拟一个回执生成器
public class ReceiptBuilder { public static List<Receipt> generateReceiptList(){ //直接模拟一堆回执对象 List<Receipt> receiptList = new ArrayList<>(); receiptList.add(new Receipt("我是MT2101回执喔","MT2101")); receiptList.add(new Receipt("我是MT1101回执喔","MT1101")); receiptList.add(new Receipt("我是MT8104回执喔","MT8104")); receiptList.add(new Receipt("我是MT9999回执喔","MT9999")); //...... return receiptList; }}
传统做法-if-else分支List<Receipt> receiptList = ReceiptBuilder.generateReceiptList();//循环处理for (Receipt receipt : receiptList) { if (StringUtils.equals("MT2101",receipt.getType())) { System.out.println("接收到MT2101回执"); System.out.println("解析回执内容"); System.out.println("执行业务逻辑"); } else if (StringUtils.equals("MT1101",receipt.getType())) { System.out.println("接收到MT1101回执"); System.out.println("解析回执内容"); System.out.println("执行业务逻辑"); } else if (StringUtils.equals("MT8104",receipt.getType())) { System.out.println("接收到MT8104回执"); System.out.println("解析回执内容"); System.out.println("执行业务逻辑"); } else if (StringUtils.equals("MT9999",receipt.getType())) { System.out.println("接收到MT9999回执"); System.out.println("解析回执内容"); System.out.println("执行业务逻辑"); System.out.println("推送邮件"); } // ......未来可能还有好多个else if}
在遇到if-else的分支业务逻辑比较复杂时 , 我们都习惯于将其抽出一个方法或者封装成一个对象去调用 , 这样整个if-else结构就不会显得太臃肿 。
就上面例子 , 当回执的类型越来越多时 , 分支else if 就会越来越多 , 每增加一个回执类型 , 就需要修改或添加if-else分支 , 违反了开闭原则(对扩展开放 , 对修改关闭)
策略模式+Map字典我们知道 , 策略模式的目的是封装一系列的算法 , 它们具有共性 , 可以相互替换 , 也就是说让算法独立于使用它的客户端而独立变化 , 客户端仅仅依赖于策略接口。
在上述场景中 , 我们可以把if-else分支的业务逻辑抽取为各种策略 , 但是不可避免的是依然需要客户端写一些if-else进行策略选择的逻辑 , 我们可以将这段逻辑抽取到工厂类中去 , 这就是策略模式+简单工厂 , 代码如下
推荐阅读
- 经常用Redis,你知道主从复制吗?
- 在Linux系统上安装和使用dig和nslookup命令
- 用elastic-job-lite玩转SpringBoot定时器管理
- 滇红茶史追溯介绍,金丝滇红茶的功效与作用
- 冲泡绿茶用什么器具,蜜梨绿茶的做法
- 茶器的实用性与美感,关于紫砂壶的实用性使用功能
- 杜仲功效与作用是什么,七福饮的功效与作用
- 淳安大方茶品质特点,淳安大方茶功效与作用
- 茶的功效与作用禁忌,胖大海的禁忌与功效作用
- 茶渣的好用处,茶的环保生活茶渣妙用二