zoukankan      html  css  js  c++  java
  • 策略模式2

    接上篇。

    做一做就发现问题了:

    1、有的时候两个代码块都是插一个表,这样getType()方法返回一个字符串肯定不够了。

    2、在解析的时候41个解析块都需要和表里的数据做比较,所以会很频繁的查表,io操作,效率太低。

    3、返回值,有时生成违规的表有很多,所以只返回一个Integer就不够了。

    一个一个来吧。

    第一个问题:

    好改,改成字符串数组就OK。

    //现在的
    @Override
    public String[] getType() {
        String[] typeArr = {SERVICE_COMPUTERINFO};
        return typeArr;
    }   
    
    //原来的
    @Override
    public String getType() {
        return SERVICE_TYPE;
    }

    前面也需要改动了

    //现在的
    String[] typeArr = serviceInterfaceEntry.getValue().getType();
    for (String type : typeArr) {
         beanMap.put(type, serviceInterfaceEntry.getValue());
    }
    //原来的
    String type = entry.getValue().getType();
    beanMap.put(type, serviceInterfaceEntry.getValue());

    开始解决第二个问题

    本来想用redis把数据缓存起来,但是想想每次字典表的更新都需要同时更新缓存,代码量啊~~工期啊~~~头疼

    后来就想在解析文件前,将公用字典表数据,全都放到map里,这样在解析时直接从map里读,避免频繁查表。

    如果需要条件查询的。直接用stream的filter,将需要的数据从字典表里过滤出来。

    public static final String SET_XX_LIST = "xxList";
    if (sCacheMap.get(SET_XX_LIST ) == null) {
        List<XX> xxList = xxService.getAll();
        sCacheMap.put(SET_XX_LIST , xxList );
    }
    //获取
     List<XX> xxList=(List<XX>) sCacheMap.get(XXX);
    List<XX> xxList = xxList.stream().filter(o -> SPicFile.TABLE_NAME.equals(o.getSetObject())
                        && "1".equals(o.getIsWeigui()))
                        .collect(Collectors.toList());

     解决第三个问题:

    将返回值放到map里。

    //old
    Integer returnVal = beanMap.get(beginEndBlockFlag).doAnalysis(param);
    
    //new
    Map<String, Integer> returnMap = beanMap.get(beginEndBlockFlag).doAnalysis(xx);
    for (String key : returnMap.keySet()) {
        Integer result = returnMap.get(key) == null ? 0 : returnMap.get(key);
        int oldValue = resultMap.get(key) == null ? 0 : resultMap.get(key);
        resultMap.put(key, oldValue + result);
    }

    这样在第一篇里:

     @Override
        public Integer doAnalysis(param) {
            //do sth;
        }

    解析方法,在做解析的时候,只需要碰到+1的情况就返回1。环境类自动就将对应key的值,更新+1了。

    做完感觉在实际项目中,如果有频繁的参数传递,用策略模式,还是工程量有些大,策略模式的场景,尽量是比较封闭的算法块。

    仅此做一个尝试吧

  • 相关阅读:
    ORACLE CASE WHEN 及 SELECT CASE WHEN的用法
    Oracle中NVARCHAR2字符集不匹配问题
    数据库读写分离
    oracle存储过程获取异常信息码和异常信息
    js删除字符串的最后一个字符三种方法
    我弄的一些TASKER配置
    分享我用Taker做任务时需要的各种资源的精华帖,方便查阅
    Tasker 正则表达式测试器
    支持Tasker控制的app合集
    Tasker文件夹说明
  • 原文地址:https://www.cnblogs.com/PPBoy/p/11290183.html
Copyright © 2011-2022 走看看