解析报文MT2101:我是MT2101回执报文喔解析报文MT8104:我是MT8104回执报文喔由于我们的目的是消除if-else , 那么这里需要将
ReceiptHandleStrategyFactory策略工厂进行改造下 , 采用字典的方式存放我的策略 , 而Map具备key-value结构 , 采用Map是个不错选择 。
稍微改造下 , 代码如下
/** * @Description: 策略工厂 * @Auther: wuzhazha */public class ReceiptHandleStrategyFactory { private static Map<String,IReceiptHandleStrategy> receiptHandleStrategyMap; private ReceiptHandleStrategyFactory(){ this.receiptHandleStrategyMap = new HashMap<>(); this.receiptHandleStrategyMap.put("MT2101",new Mt2101ReceiptHandleStrategy()); this.receiptHandleStrategyMap.put("MT8104",new Mt8104ReceiptHandleStrategy()); } public static IReceiptHandleStrategy getReceiptHandleStrategy(String receiptType){ return receiptHandleStrategyMap.get(receiptType); }}
经过对策略模式+简单工厂方案的改造 , 我们已经消除了if-else的结构 , 每当新来了一种回执 , 只需要添加新的回执处理策略 , 并修改ReceiptHandleStrategyFactory中的Map集合 。
如果要使得程序符合开闭原则 , 则需要调整
ReceiptHandleStrategyFactory中处理策略的获取方式 , 通过反射的方式 , 获取指定包下的所有IReceiptHandleStrategy实现类 , 然后放到字典Map中去 。系统学习设计模式:设计模式内容聚合
责任链模式责任链模式是一种对象的行为模式 。在责任链模式里 , 很多对象由每一个对象对其下家的引用而连接起来形成一条链 。请求在这个链上传递 , 直到链上的某一个对象决定处理此请求 。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求 , 这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任
回执处理者接口
/** * @Description: 抽象回执处理者接口 * @Auther: wuzhazha */public interface IReceiptHandler { void handleReceipt(Receipt receipt,IReceiptHandleChain handleChain);}
责任链接口/** * @Description: 责任链接口 * @Auther: wuzhazha */public interface IReceiptHandleChain { void handleReceipt(Receipt receipt);}
责任链接口实现类/** * @Description: 责任链实现类 * @Auther: wuzhazha */public class ReceiptHandleChain implements IReceiptHandleChain { //记录当前处理者位置 private int index = 0; //处理者集合 private static List<IReceiptHandler> receiptHandlerList; static { //从容器中获取处理器对象 receiptHandlerList = ReceiptHandlerContainer.getReceiptHandlerList(); } @Override public void handleReceipt(Receipt receipt) { if (receiptHandlerList !=null && receiptHandlerList.size() > 0) { if (index != receiptHandlerList.size()) { IReceiptHandler receiptHandler = receiptHandlerList.get(index++); receiptHandler.handleReceipt(receipt,this); } } }}
具体回执处理者public class Mt2101ReceiptHandler implements IReceiptHandler { @Override public void handleReceipt(Receipt receipt, IReceiptHandleChain handleChain) { if (StringUtils.equals("MT2101",receipt.getType())) { System.out.println("解析报文MT2101:" + receipt.getMessage()); } //处理不了该回执就往下传递 else { handleChain.handleReceipt(receipt); } }}public class Mt8104ReceiptHandler implements IReceiptHandler { @Override public void handleReceipt(Receipt receipt, IReceiptHandleChain handleChain) { if (StringUtils.equals("MT8104",receipt.getType())) { System.out.println("解析报文MT8104:" + receipt.getMessage()); } //处理不了该回执就往下传递 else { handleChain.handleReceipt(receipt); } }}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 经常用Redis,你知道主从复制吗?
- 在Linux系统上安装和使用dig和nslookup命令
- 用elastic-job-lite玩转SpringBoot定时器管理
- 滇红茶史追溯介绍,金丝滇红茶的功效与作用
- 冲泡绿茶用什么器具,蜜梨绿茶的做法
- 茶器的实用性与美感,关于紫砂壶的实用性使用功能
- 杜仲功效与作用是什么,七福饮的功效与作用
- 淳安大方茶品质特点,淳安大方茶功效与作用
- 茶的功效与作用禁忌,胖大海的禁忌与功效作用
- 茶渣的好用处,茶的环保生活茶渣妙用二