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

相关推荐
杨DaB14 分钟前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
YA33315 分钟前
java基础(九)sql基础及索引
java·开发语言·sql
桦说编程35 分钟前
方法一定要有返回值 \ o /
java·后端·函数式编程
小李是个程序1 小时前
登录与登录校验:Web安全核心解析
java·spring·web安全·jwt·cookie
David爱编程1 小时前
Java 创建线程的4种姿势,哪种才是企业级项目的最佳实践?
java·后端
hrrrrb2 小时前
【Java Web 快速入门】十一、Spring Boot 原理
java·前端·spring boot
Java微观世界2 小时前
Object核心类深度剖析
java·后端
MrSYJ2 小时前
为什么HttpSecurity会初始化创建两次
java·后端·程序员
hinotoyk2 小时前
TimeUnit源码分享
java
AAA修煤气灶刘哥3 小时前
Java+AI 驱动的体检报告智能解析:从 PDF 提取到数据落地全指南
java·人工智能·后端