来吧,用设计模式来干掉 if-else( 三 )

解析报文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);        }    }}


推荐阅读