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 的,而设计模式大部分用于架构层,至于该怎么用,我觉得还是黑猫白猫都行。

相关推荐
AskHarries15 分钟前
Spring Boot集成geode快速入门Demo
java·spring boot·后端·geode
小哇66628 分钟前
SpringBoot整合Minio
java·spring boot·spring
Tech Synapse41 分钟前
Java循环创建对象内存溢出怎么解决
java·开发语言·jvm
IT·陈寒41 分钟前
Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)
java·python·kotlin
行动π技术博客1 小时前
spring中IOC相关介绍
java·spring·rpc
吃青椒的小新1 小时前
独一无二的设计模式——单例模式(Java实现)
java·后端·单例模式·设计模式
天才梦浪1 小时前
开源租房项目
java·项目
杰哥在此1 小时前
Java面试题:解释跨站脚本攻击(XSS)的原理,并讨论如何防范
java·开发语言·面试·编程·xss
Czi橙2 小时前
玩玩快速冥(LeetCode50题与70题以及联系斐波那契)
java·算法·快速幂·斐波那契
青云交2 小时前
Java面试题--JVM大厂篇之深入了解G1 GC:大型Java应用的性能优化利器
java·jvm·性能优化·g1 gc适用的具体场景·g1 gc的特点·g1 gc的配置和调优示例·混合回收