前言
物流行业中,通常会涉及到EDI报文(XML格式文件)传输和回执接收,每发
送一份EDI报文,后续都会收到与之关联的回执(标识该数据在第三方系统
中的流转状态)。
这里枚举几种回执类型:MT1101、MT2101、MT4101、MT8104、MT810
5、MT9999,系统在收到不同的回执报文后,会执行对应的业务逻辑处理
。当然,实际业务场景并没有那么笼统,这里以回执处理为演示案例
模拟一个回执类
@Data
public 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进行策略选择的逻辑,我们可以将这段逻辑抽取到工厂类中去,这就是
策略模式+简单工厂,代码如下
策略接口
/**
* @Description:
回执处理策略接口
* @Auther: wuzhazha
*/
public interface IReceiptHandleStrategy {
void handleReceipt(Receipt receipt);
}
策略接口实现类,也就是具体的处理者
public class Mt2101ReceiptHandleStrategy implements IReceiptHandleStrategy {
@Override
public void handleReceipt(Receipt receipt) {
System.out.println("解析报文MT2101:" + receipt.getMessage());
}
}
public class Mt1101ReceiptHandleStrategy implements IReceiptHandleStrategy {
@Override
public void handleReceipt(Receipt receipt) {
System.out.println("解析报文MT1101:" + receipt.getMessage());
}
}
public class Mt8104ReceiptHandleStrategy implements IReceiptHandleStrategy {
@Override
public void handleReceipt(Receipt receipt) {
System.out.println("解析报文MT8104:" + receipt.getMessage());
}
}