文档章节

结合Spring实现策略模式

o
 osc_zoa3moe9
发布于 2019/12/07 21:42
字数 523
阅读 45
收藏 0

精选30+云产品,助力企业轻松上云!>>>

  最近系统需要对不同维度的数据进行差异化计算,也就会使用不同算法。为了以后更加容易扩展,结合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);
        }
    }
}

 

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
结合Spring特性实现策略模式

今天我们来了解下设计模式中比较常用的策略模式 什么是策略模式? 策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相...

osc_upj9n4as
2019/05/07
3
0
策略模式、策略模式与Spring的碰撞

策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式。 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A...

osc_vcgg4s9o
07/01
7
0
策略模式、策略模式与Spring的碰撞

策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式。 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A...

CodeBear
06/30
0
0
策略模式、策略模式与Spring的碰撞

策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式。 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A...

osc_yo7hxxom
07/01
5
0
漫谈 GOF 设计模式在 Spring 框架中的实现

原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」。一群同频者,一起成长,一起精进,打破认知的局限性。 漫谈 GOF 设计模式在 Spring 框架中的实现...

osc_0vxxme2b
04/16
1
0

没有更多内容

加载失败,请刷新页面

加载更多

Xcode中的版本与版本 - Version vs build in Xcode

问题: I have an app that I developed with Xcode 3 and recently started editing with Xcode 4. In the target summary I have the iOS application target form with fields: identifie......

javail
36分钟前
7
0
如何在Python中将字典键作为列表返回? - How to return dictionary keys as a list in Python?

问题: In Python 2.7 , I could get dictionary keys , values , or items as a list: 在Python 2.7中 ,我可以将字典键 , 值或项作为列表获取: >>> newdict = {1:0, 2:0, 3:0}>>> newd......

技术盛宴
今天
17
0
2020世界人工智能大会开幕首日 百度与浦发银行达成战略合作

本文作者:y****n 7月9日,2020世界人工智能大会开幕首日,百度与浦发银行签署战略合作协议,将在人工智能、金融科技等多个领域进一步深化合作。双方将优势互补,实现人工智能技术在金融领域...

百度开发者中心
昨天
26
0
Java中C ++ Pair 的等价物是什么? - What is the equivalent of the C++ Pair in Java?

问题: Is there a good reason why there is no Pair<L,R> in Java? 有没有一个很好的理由说明Java中没有Pair<L,R> ? What would be the equivalent of this C++ construct? 这个C ++构造的......

富含淀粉
今天
18
0
中国饭店协会数据表明

记者了解到,中国饭店协会数据表明,2018年全国餐饮收入42716亿元,同比增长9.5%.根据国家统计局数据显示,截至2017年底,限额以上餐饮行业的从业人数达到2232万人,巨大的餐饮市场背后,餐饮行业的...

asd369
今天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部