JAVA 替代SWITCH 枚举值 CASE 的 策略模式

看看使用策略模式之前的代码:

java 复制代码
//        switch (type) {
//            case 0:
//                terme.setKhdmlist(dmList);
//                List<Kehu> list = getSdList$api(terme);
//                for (Kehu kehu : list) {
//                    map = new HashMap<String, String>();
//                    map.put(kehu.getKhdm(), kehu.getKhmc());
//                    mapList.add(map);
//                }
//                break;
//            case 1:
//                terme.setGhsdmlist(dmList);
//                List<Gonghuoshang> list1 = getGhsList$api(terme);
//                for (Gonghuoshang gonghuoshang : list1) {
//                    map = new HashMap<String, String>();
//                    map.put(gonghuoshang.getGhsdm(), gonghuoshang.getGhsmc());
//                    mapList.add(map);
//                }
//                break;
//            case 2:
//                terme.setKhdmlist(dmList);
//                List<Kehu> list2 = getKehuList$api(terme);
//                for (Kehu kehu : list2) {
//                    map = new HashMap<String, String>();
//                    map.put(kehu.getKhdm(), kehu.getKhmc());
//                    mapList.add(map);
//                }
//                break;
//            case 3:
//                terme.setCkdmlist(dmList);
//                List<Cangku> list3 = getCangkuList$api(terme);
//                for (Cangku cangku : list3) {
//                    map = new HashMap<String, String>();
//                    map.put(cangku.getCkdm(), cangku.getCkmc());
//                    mapList.add(map);
//                }
//                break;
//            case 4:
//                terme.setQddmlist(dmList);
//                List<Qudao> list4 = getQudaoList$api(terme);
//                for (Qudao qudao : list4) {
//                    map = new HashMap<String, String>();
//                    map.put(qudao.getQddm(), qudao.getQdmc());
//                    mapList.add(map);
//                }
//                break;
//            case 5:
//                terme.setQydmlist(dmList);
//                List<Quyu> list5 = getQuyuList$api(terme);
//                for (Quyu quyu : list5) {
//                    map = new HashMap<String, String>();
//                    map.put(quyu.getQydm(), quyu.getQymc());
//                    mapList.add(map);
//                }
//                break;
//            case 6:
//                terme.setPpdmlist(dmList);
//                List<Pinpai> list6 = getPinpaiList$api(terme);
//                for (Pinpai pinpai : list6) {
//                    map = new HashMap<String, String>();
//                    map.put(pinpai.getPpdm(), pinpai.getPpmc());
//                    mapList.add(map);
//                }
//                break;
//            default:
//                break;
//        }
//        for (SysLimitItemGroupmx itemGroupmx : resList) {
//            boolean flag = false;
//            if (isNotEmpty(mapList)) {
//                for (Map<String, String> map1 : mapList) {
//                    if (map1.containsKey(itemGroupmx.getDxdm())) {
//                        flag = true;
//                        if (!map1.containsValue(itemGroupmx.getDxmc())) {
//                            itemGroupmx.setBz(str + "编码对应的" + str + "名称不对!");
//                        }
//                        break;
//                    }
//                }
//            }
//            if (!flag) {
//                itemGroupmx.setBz(str + "编码对应的数据不存在!");
//            }
//        }

使用 策略模式 之后的代码:

枚举类:

java 复制代码
public enum LimitItemTypeEnum {


    OUTMETHOD(-1 ,"-1", "输出方法"),
    SHOP    (0 ,"0", "XX"),
    SUPPLIER(1 ,"1", "XXX"),
    CUSTOMER(2 ,"2", "XX"),
    STORE   (3 ,"3", "XX"),
    CHANNEL (4 ,"4", "XX"),
    AREA    (5, "5", "XX"),
    BRAND   (6, "6", "XX"),
    ;
    private final Integer number;
    private final String code;
    private final String info;

    LimitItemTypeEnum(Integer number, String code, String info) {
        this.number=number;
        this.code = code;
        this.info = info;
    }
    public String getCode() {
        return code;
    }
    public String getInfo() {
        return info;
    }
    public Integer getNumber() {
        return number;
    }


    public String getInfoByNumber(int numberIn){
         String infoOut="";
         for(LimitItemTypeEnum typeEnum:LimitItemTypeEnum.values()){
            if(typeEnum.getNumber()==numberIn){
                infoOut=typeEnum.getInfo();
                break;
            }
         }
         return infoOut;
    }



}

接口:

java 复制代码
public interface CheckListItemService {

    void check(Long tenantId,List<SysLimitItemGroupmx> mxList) throws Exception;

}

实现类:

java 复制代码
public class CheckAreaListItemServiceImpl extends ApiFrag implements CheckListItemService {


    @Override
    public void check(Long tenantId,List<SysLimitItemGroupmx> mxList) throws Exception{
        String typeName= LimitItemTypeEnum.AREA.getInfo();
        Terme term=new Terme();
        term.setTenantId(tenantId);
        term.setQydmlist(listField2StrList(mxList,"dxdm"));
        List<Quyu> list = getQuyuList$api(term);
        Map<String, String> map  = new HashMap();;
        for (Quyu quyu : list) {
            map.put(quyu.getQydm(), quyu.getQymc());
        }
        for (SysLimitItemGroupmx itemGroupmx : mxList) {
            String key=itemGroupmx.getDxdm();
            boolean flag = map.containsKey(key);
            if(flag)    itemGroupmx.setDxmc(map.get(key));
            else    itemGroupmx.setBz(typeName + "编码对应的数据不存在!");
            itemGroupmx.setFlag(flag);
        }
    }



}
java 复制代码
public class CheckBrandListItemServiceImpl extends ApiFrag implements CheckListItemService {


    @Override
    public void check(Long tenantId,List<SysLimitItemGroupmx> mxList) throws Exception{
        String typeName= LimitItemTypeEnum.BRAND.getInfo();
        Terme term=new Terme();
        term.setTenantId(tenantId);
        term.setPpdmlist(listField2StrList(mxList,"dxdm"));
        List<Pinpai> list = getPinpaiList$api(term);
        Map<String, String> map  = new HashMap();;
        for (Pinpai item : list) {
            map.put(item.getPpdm(), item.getPpmc());
        }
        for (SysLimitItemGroupmx itemGroupmx : mxList) {
            String key=itemGroupmx.getDxdm();
            boolean flag = map.containsKey(key);
            if(flag)    itemGroupmx.setDxmc(map.get(key));
            else    itemGroupmx.setBz(typeName + "编码对应的数据不存在!");
            itemGroupmx.setFlag(flag);
        }
    }



}

上下文类:

java 复制代码
public class CheckLimitItemProcessor {

    private final Map<Integer, CheckListItemService> strategyMap;

    public CheckLimitItemProcessor() {
        strategyMap = new HashMap<>();
        strategyMap.put(LimitItemTypeEnum.AREA.getNumber(), new CheckAreaListItemServiceImpl());
        strategyMap.put(LimitItemTypeEnum.BRAND.getNumber(), new CheckBrandListItemServiceImpl());
        strategyMap.put(LimitItemTypeEnum.CUSTOMER.getNumber(), new CheckCustomerListItemServiceImpl());
        strategyMap.put(LimitItemTypeEnum.SHOP.getNumber(), new CheckShopListItemServiceImpl());
        strategyMap.put(LimitItemTypeEnum.STORE.getNumber(), new CheckStoreListItemServiceImpl());
        strategyMap.put(LimitItemTypeEnum.SUPPLIER.getNumber(), new CheckSupplierListItemServiceImpl());

    }

    public void checkItem(Integer type,Long tenantId, List<SysLimitItemGroupmx> mxList)
            throws Exception{
        CheckListItemService strategy = strategyMap.get(type);
        if (strategy == null) {
            throw new IllegalArgumentException("Unsupported LimitItem type.");
        }
        strategy.check(tenantId,mxList);
    }

}

使用:

java 复制代码
      CheckLimitItemProcessor processor = new CheckLimitItemProcessor();
        processor.checkItem(type,tenantId,resList);

在java 中实际开发功能时候,我想绝大多数人应该是倾向于使用case when 的,而设计模式大部分用于架构层,至于该怎么用,我觉得还是黑猫白猫都行。

相关推荐
挺菜的9 分钟前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
掘金-我是哪吒1 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪1 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm1 小时前
spring事件使用
java·后端·spring
微风粼粼2 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄2 小时前
设计模式之中介者模式
java·设计模式·中介者模式
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温3 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2743 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba3 小时前
Maven
java·maven