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

相关推荐
Jelena1577958579213 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
神明不懂浪漫14 小时前
【第五章】Java中的继承与多态
java·开发语言
AI多Agent协作实战派16 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit16 小时前
Java+Ai+vue
java·spring·maven
qq_25183645717 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
LayZhangStrive17 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
未秃头的程序猿17 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程
曹牧17 小时前
Eclipse 批量文本替换
java·ide·eclipse
程序员清风17 小时前
OpenAI官方发布最新提示词技巧!
java·后端·面试
一只枫林17 小时前
MySQL内、外连接知识点汇总
java·前端·数据库