结合Spring实现策略模式
最近系统需要对不同维度的数据进行差异化计算,也就会使用不同算法。为了以后更加容易扩展,结合Spring框架及策略模式对实现架构做了系统设计。
1. 定义策略接口(Strategy):
import com.dmall.scfc.biz.dao.model.ScfcScoreField;
import com.dmall.scfc.biz.dao.model.ScfcScoreFieldValue;
import com.dmall.scfc.biz.dto.ScoreModelDimensionDTO; import java.util.List; /**
* @author wangxuexing
* @descrption 数据抽取策略
* @date 2019/12/4
*/
public interface Strategy {
/**
* 是否匹配策略
* @param scoreField 基础字段
* @return
*/
boolean isMatch(ScfcScoreField scoreField);
/**
* 根据具体字段抽取数据
* @param dimensionRule
* @return
*/
List<ScfcScoreFieldValue> extractData(ScoreModelDimensionDTO dimensionRule) throws Exception;
}
2. 实现具体策略
import java.util.List; /**
* @author wangxuexing
* @descrption scf-score 基础维度表按模型设置日期聚合策略
* @date 2019/12/4
*/
@Service
public class BaseBySettingStrategy implements Strategy {
@Autowired
private ScfcScoreFieldValueService scoreFieldValueService; @Override
public boolean isMatch(ScfcScoreField scoreField) {
return ProcessFlagEnum.BASE_BY_SETTING.getCode() == scoreField.getProcessFlag();
} @Override
public List<ScfcScoreFieldValue> extractData(ScoreModelDimensionDTO dimensionRule) throws Exception {
return scoreFieldValueService.getBaseFieldValueByDimension(dimensionRule);
}
}
可以继续往后继续实现多个算法,这里就不一一列举。
3. Spring Boot启动时初始化各算法
import com.dmall.scfc.task.strategy.Strategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* @author wangxuexing
* @descrption 加载所有抽取策略
* @date 2019/12/4
*/
@Configuration
public class ExtractStrategyConfig {
@Autowired
private ApplicationContext applicationContext; @Bean
public List<Strategy> pipelineProcessors() {
Map<String, Strategy> beansOfType = applicationContext.getBeansOfType(Strategy.class);
List<Strategy> strategies = new ArrayList<Strategy>();
for (Strategy processService : beansOfType.values()) {
strategies.add(processService);
}
return strategies;
}
}
4. 基于业务场景对不同策略经行调用
import com.dmall.dispatcher.sdk.util.IBasicExecuteContext; /**
* @author wangxuexing
* @descrption 数据抽取服务
* @date 2019/12/4
*/
public interface DataExtractService {
/**
* 根据具体字段抽取数据
*/
void extractData();
}
/**
* @author wangxuexing
* @descrption 上下文调用各策略
* @date 2019/12/4
*/
@Slf4j
@Service
public class DataExtractServiceImpl implements DataExtractService {
@Autowired
private List<Strategy> strategyList;
/**
* 根据具体字段抽取数据
*/
@Override
public void extractData() {
//查询所有核心企业,所有维度公式及条件
List<ScoreModelDimensionDTO> scoreModelDimensionDTOS = scfcScoreModelDimensionService.getAllScoreModelDimensions();
scoreModelDimensionDTOS.forEach(item -> {
//执行不同满足匹配条件的策略
strategyList.forEach(strategy -> {
extractAndInsertDataByStrategy(strategy, item);
});
});
} /**
* 根据策略抽取数据并插入
*/
@Async//多线程异步计算插入数据
private void extractAndInsertDataByStrategy(Strategy strategy,
ScoreModelDimensionDTO dimensionRule){
try{
List<Long> fieldIds = scoreFields.stream()
.filter(scoreField -> strategy.isMatch(scoreField))
.map(x->x.getId())
.collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(fieldIds)) {
dimensionRule.setScoreRuleIds(fieldIds);
//根据策略抽取数据
List<ScfcScoreFieldValue> resultList = strategy.extractData(dimensionRule);
if(CollectionUtils.isNotEmpty(resultList)) {
//设置维度ID及抓取时间
scoreFieldValueService.insertScoreFieldValueBatch(resultList);
}
}
} catch (Exception e) {
log.error("根据策略"+strategy.getClass().getName()+"抽取数据失败", e);
}
}
}
结合Spring实现策略模式的更多相关文章
- Spring 实现策略模式--自定义注解方式解耦if...else
策略模式 定义 定义一簇算法类,将每个算法分别封装起来,让他们可以互相替换,策略模式可以使算法的变化独立于使用它们的客户端 场景 使用策略模式,可以避免冗长的if-else 或 switch分支判断 ...
- 基于Spring实现策略模式
背景: 看多很多策略模式,总结下来实现原理大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案:这个方案主要是看了一些开源rpc和Spring相关源码后的一些思路,所以在此进行总结 首 ...
- 策略模式、策略模式与Spring的碰撞
策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...
- Spring设计模式_策略模式/其他
策略模式特性 1.执行最终结果一样 2.执行过程和执行逻辑不一样 3.使用同一接口 达到目的就可以了 Git地址 https://github.com/wujiachengSH/WjcStrategy ...
- 设计模式_策略模式_在Spring中的应用
一.理论 在spring中经常有读取配置文件的需求,这里就会用到一个Spring提供的Resource接口 Resource 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口.Resour ...
- 在商城系统中使用设计模式----策略模式之在spring中使用策略模式
1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...
- 【Spring源码解析】—— 策略模式在Spring中的应用
一. 什么是策略模式 策略模式的定义/含义:策略本身就是为了实现某一个目标而采取的一种工作方式,因此只要能够达成目标,则采取哪一种策略都可以:因此多种实际的策略之间是相互平行的. 注意 ...
- 如何在Spring Boot项目中巧妙利用策略模式干掉if else!
直入主题 我们都知道,设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性 ...
- Spring中常见的设计模式——策略模式
策略模式(Strategy Pattern) 一.策略模式的应用场景 策略模式的应用场景如下: 系统中有很多类,而他们的区别仅仅在于行为不同. 一个系统需要动态的在集中算法中选择一种 二.用策略模式实 ...
随机推荐
- 一些优秀的 Entity Framework 开源项目
增加全局过滤的项目(比如:IsDeleted 字段):https://github.com/zzzprojects/EntityFramework.DynamicFilters 谢谢浏览!
- Neo4j 第十一篇:Cypher函数
Cypher函数是对图进行查询和操作的重要工具. 一,谓词函数 谓词函数返回true或者false,主要用于检查是否存在或满足特定的条件. 1,Exists 如果指定的模式存在于图中,或者特定的属性存 ...
- 升级 ASP.NET Core 3.0 设置 JSON 返回 PascalCase 格式与 SignalR 问题
由于一些 JS 组件要求 JSON 格式是 PascalCase 格式,新版本 ASP.NET Core 3.0 中默认移除了 Newtonsoft.Json ,使用了微软自己实现的 System.T ...
- java架构之路-(nginx使用详解)nginx的反向代理和优化配置
书接上回说,nginx我们学会了简单的配置.那么我今天来聊一下,我们ngxin的一些优化配置(我不是很懂,不敢谈高级配置).我先来看一下nginx的好处和正向代理. nginx的好处 1.可以高并发连 ...
- Winform(C#)中Chart控件鼠标点击显示波形上相应点对应坐标轴的x,y值
方法一:鼠标点击波形 鼠标点击波形,显示点击位置的x,y值 private void chart1_MouseClick(object sender, MouseEventArgs e) //cha ...
- git 使用 tortoisegit 解冲突
git 解冲突需要注意的问题 弄清除冲突双向的修改意图,并在解决冲突时,同时处理两边的意图. 举例说明 A.txt 文件, 在 master 分支上,有一行文字(代码)是这样: 这是一段在 maste ...
- python3测试网站网速
一.运行环境 1.Windows 10 2.python 3.8 二.安装第三方库pycurl 1.先安装 pip install wheel 2.在安装pycurl https://download ...
- Java学习——单元测试JUnit
Java学习——单元测试JUnit 摘要:本文主要介绍了什么是单元测试以及怎么进行单元测试. 部分内容来自以下博客: https://www.cnblogs.com/wxisme/p/4779193. ...
- iframe超出外层元素显示滚动条怎么办?
尝试把外层盒子滚动条样式隐藏,或者设为overflow:hidden等都不生效,突然发现iframe有这个属性的忘记用了!! <iframe frameborder="0" ...
- 转 echarts 的使用时遇到的坑 初始化和销毁,亲测有效!
纵观ECharts图表实例化的API,主要有一下几个相关的实例化方法: 1.setOption(Object option,{boolean = true} notMerge) 参数: 1).Obje ...