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

推荐订阅源

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出错 策略模式2 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)
策略模式1
PPBoy · 2019-07-26 · via 博客园 - PPBoy

知道这个模式很久了,也觉得很有用,但是工作上一直找不到实际应用场景,如果工程量小,根本不值得过度设计。

这次刚好项目中有一个场景。有点符合使用场景。

有一个文件解析的功能,一共40多个判断。3000多行代码。其中每一块都有独特的解析逻辑,最多的需要8表连查判断,于是想用策略模式解耦。

解析的文件以begin XXX/end XXX作为一个解析块。

if/else判断对应的XXX,并写业务逻辑。

这里应该要应用工厂+策略来确定用哪个service处理解析逻辑。

但是springIOC里都已经把实例放进去了。

所以我的设想是:

1、一个Map<String, Service>来对应标识和service实例,实现context的功能。

2、读取到哪个标识,自动调用相应实例的指定方法,来实现自己的逻辑。

3、这样场景类的代码就很少了,而且增加了扩展性。

想法很丰满,后期还是碰到很多问题,不过个人认为是值得的,

6个人一起写一个文件,光处理冲突、定义全局变量,定义返回变量等细碎操作就把人磨死了

啥也别说,开始实现,先写一个策略接口:

public interface IStrategy{
    String getType();

    Integer doAnalysis(param);
}

接口很简单,每个类自己需要返回自己的Type,对应标识字符串,doAnalysis()方法写业务逻辑,返回一个操作数量。

下来写具体的service:

@Service
public class TestService extends BaseService<Test> implements IStrategy{
    private static final String SERVICE_TYPE = "XXX";
    
    @Override
    public String getType() {
        return SERVICE_TYPE;
    }

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

下来该场景类去把大家整合起来了:

//从容器中将继承了接口的实例全拿出来。
1
ServletContext sc = ContextLoader.getCurrentWebApplicationContext().getServletContext(); 2 ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc); 3 Map<String, IStrategy> tempMap = ac.getBeansOfType(IStrategy.class);
//构建context
4 Map<String, IStrategy> beanMap = new HashMap<>(); 5 for (Map.Entry<String, IStrategy> entry: tempMap.entrySet()) { 6 String type = entry.getValue().getType(); 7 beanMap.put(type, serviceInterfaceEntry.getValue()); 8 } 9 //beginEndBlockFlag是begin/end代码块标识 10 Integer returnVal = beanMap.get(beginEndBlockFlag).doAnalysis(param);

这样就做到了根据标识自动从map中得到service实例,自动调用业务逻辑方法,做解析。

to be continue....