惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
美团技术团队
Attack and Defense Labs
Attack and Defense Labs
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
IT之家
IT之家
GbyAI
GbyAI
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
量子位
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
Recent Announcements
Recent Announcements
月光博客
月光博客
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
D
DataBreaches.Net
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
罗磊的独立博客
人人都是产品经理
人人都是产品经理
U
Unit 42
宝玉的分享
宝玉的分享
V
V2EX
雷峰网
雷峰网
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 叶小钗
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LINUX DO - 热门话题
Engineering at Meta
Engineering at Meta
P
Palo Alto Networks Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Apple Machine Learning Research
Apple Machine Learning Research
Cyberwarzone
Cyberwarzone
腾讯CDC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
爱范儿
爱范儿
V
Vulnerabilities – Threatpost
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
S
Securelist
Google DeepMind News
Google DeepMind News
小众软件
小众软件
T
Threat Research - Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LangChain Blog

博客园 - PPBoy

状态机的轮子 oracle生成path的sql语句 oracle表空间异常大 springboot2集成activiti出错 策略模式1 sql从n月到m月数据汇总,没有数据,当月显示0 jsp下拉列表 dao层取值用List<map<String,Object>>接收有序map 在线预览pdf springboot打jar包,调用webservice出错 导出到word ueditor后台配置项返回格式出错,上传功能将不能正常使用 js控制多层单选,多选按钮,做隐藏操作 js控制全屏及退出全屏 springboot2.0jar包启动异常 第九篇: 高可用的服务注册中心 第八篇: 服务链路追踪(Spring Cloud Sleuth) 第七篇: 消息总线(Spring Cloud Bus) 第六篇: 分布式配置中心(Spring Cloud Config)
策略模式2
PPBoy · 2019-08-02 · via 博客园 - PPBoy

接上篇。

做一做就发现问题了:

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了。

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

仅此做一个尝试吧