设计模式实战 策略模式优化if else
设计模式 策略模式优化if else实战
·
业务代码经过优化处理,为了方便理解,将list和查询语句不复用
for (String type : DIMENSION_TYPE) {
if ("dept_id".equals(type)) {
List<ElectricHourReport> list = new ArrayList<ElectricHourReport>(64);
List<ElectricConsumerSumSo> electricConsumerSumList = dwdElectricConsumeMapper.hourReport(beforeDate, type);
for (ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if (deptMap.containsKey(Long.parseLong(sumSo.getId()))) {
String dimension = deptMap.get(Long.parseLong(sumSo.getId())).getDeptName();
ElectricHourReport electricHourReport = new ElectricHourReport(dimension,
type,
yymmddhh.get(MY_YEAR),
yymmddhh.get(MY_MONTH),
yymmddhh.get(MY_DAY),
yymmddhh.get(MY_HOUR),
sumSo.getConsume(),
nowDate);
list.add(electricHourReport);
}
}
}
if ("build_id".equals(type)) {
List<ElectricHourReport> list = new ArrayList<ElectricHourReport>(64);
List<ElectricConsumerSumSo> electricConsumerSumList = dwdElectricConsumeMapper.hourReport(beforeDate, type);
for (ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if (buildMap.containsKey(sumSo.getId())) {
String dimension = buildMap.get(sumSo.getId()).getBuildName();
ElectricHourReport electricHourReport = new ElectricHourReport(dimension,
type,
yymmddhh.get(MY_YEAR),
yymmddhh.get(MY_MONTH),
yymmddhh.get(MY_DAY),
yymmddhh.get(MY_HOUR),
sumSo.getConsume(),
nowDate);
list.add(electricHourReport);
}
}
}
}
定义策略接口
package com.rjgf.report.other.design;
import com.rjgf.report.domain.ElectricHourReport;
import java.util.List;
/**
* @author
* @date 2022/9/22 6:51
* @remark
*/
public interface ElectricConsumerStrategy {
/**
*
*
*/
void hourReport(String type);
}
实现策略接口
package com.rjgf.report.other.design;
import com.rjgf.common.core.utils.MyDateUtil;
import com.rjgf.common.core.utils.SpringUtils;
import com.rjgf.common.redis.service.RedisService;
import com.rjgf.report.domain.ElectricConsumerSumSo;
import com.rjgf.report.domain.ElectricHourReport;
import com.rjgf.report.mapper.DwdElectricConsumeMapper;
import com.rjgf.system.api.domain.EnergyBuild;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static com.rjgf.common.core.constant.CacheConstants.BUILD_REDIS_CACHE_KEY;
import static com.rjgf.common.core.utils.MyDateUtil.*;
/**
* @author
* @date 2022/9/22 6:53
* @remark
*/
public class BuildElectricConsumerStrategy implements ElectricConsumerStrategy {
@Override
public void hourReport(String type) {
Date nowDate = new Date();
String beforeDate = MyDateUtil.beforeHourToString(nowDate, 1);
Map<String, Integer> yymmddhh = MyDateUtil.getYYMMDDHH(beforeDate);
Map<String, EnergyBuild> buildMap = SpringUtils.getBean(RedisService.class).getCacheMap(BUILD_REDIS_CACHE_KEY);
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils.getBean(DwdElectricConsumeMapper.class);
List<ElectricHourReport> list = new ArrayList<ElectricHourReport>(64);
List<ElectricConsumerSumSo> electricConsumerSumList = dwdElectricConsumeMapper.hourReport(beforeDate, type);
for (ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if (buildMap.containsKey(sumSo.getId())) {
String dimension = buildMap.get(sumSo.getId()).getBuildName();
ElectricHourReport electricHourReport = new ElectricHourReport(dimension,
type,
yymmddhh.get(MY_YEAR),
yymmddhh.get(MY_MONTH),
yymmddhh.get(MY_DAY),
yymmddhh.get(MY_HOUR),
sumSo.getConsume(),
nowDate);
list.add(electricHourReport);
}
}
dwdElectricConsumeMapper.batchInsertElectricHourReport(list);
}
}
package com.rjgf.report.other.design;
import com.rjgf.common.core.utils.MyDateUtil;
import com.rjgf.common.core.utils.SpringUtils;
import com.rjgf.report.domain.ElectricConsumerSumSo;
import com.rjgf.report.domain.ElectricHourReport;
import com.rjgf.report.mapper.DwdElectricConsumeMapper;
import com.rjgf.system.api.RemoteDeptService;
import com.rjgf.system.api.domain.SysDept;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static com.rjgf.common.core.constant.SecurityConstants.INNER;
import static com.rjgf.common.core.utils.MyDateUtil.*;
/**
* @author
* @date 2022/9/22 6:53
* @remark
*/
public class DeptElectricConsumerStrategy implements ElectricConsumerStrategy {
@Override
public void hourReport(String type) {
Date nowDate = new Date();
String beforeDate = MyDateUtil.beforeHourToString(nowDate, 1);
Map<String, Integer> yymmddhh = MyDateUtil.getYYMMDDHH(beforeDate);
RemoteDeptService remoteDeptService = SpringUtils.getBean(RemoteDeptService.class);
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils.getBean(DwdElectricConsumeMapper.class);
Map<Long, SysDept> deptMap = remoteDeptService.map(INNER).getData();
List<ElectricHourReport> list = new ArrayList<ElectricHourReport>(64);
List<ElectricConsumerSumSo> electricConsumerSumList = dwdElectricConsumeMapper.hourReport(beforeDate, type);
for (ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if (deptMap.containsKey(Long.parseLong(sumSo.getId()))) {
String dimension = deptMap.get(Long.parseLong(sumSo.getId())).getDeptName();
ElectricHourReport electricHourReport = new ElectricHourReport(dimension,
type,
yymmddhh.get(MY_YEAR),
yymmddhh.get(MY_MONTH),
yymmddhh.get(MY_DAY),
yymmddhh.get(MY_HOUR),
sumSo.getConsume(),
nowDate);
list.add(electricHourReport);
}
}
dwdElectricConsumeMapper.batchInsertElectricHourReport(list);
}
}
使用工厂模式创建策略 ,饿汉式(静态代码块方式)
package com.rjgf.report.other.design;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
import static com.rjgf.report.service.impl.DwdElectricConsumeServiceImpl.DIMENSION_TYPE;
/**
* @author
* @date 2022/9/22 8:36
* @remark 创建者模式:工厂创建单例 ,饿汉式-方式2(静态代码块方式)
*/
public class ElectricConsumerStrategyFactory {
/**
* 维度类型 部门、建筑、能耗分类
*/
public static final String[] DIMENSION_TYPE = {"dept_id", "build_id","energy_category"};
static Map<String, ElectricConsumerStrategy> map;
static {
map = ImmutableMap.of(
DIMENSION_TYPE[0], new DeptElectricConsumerStrategy(),
DIMENSION_TYPE[1], new BuildElectricConsumerStrategy(),
DIMENSION_TYPE[2], new EnergyCategoryElectricConsumerStrategy()
);
}
public static class SingletonHolder {
public static ElectricConsumerStrategyFactory electricConsumerStrategyFactory = new ElectricConsumerStrategyFactory();
}
public static ElectricConsumerStrategyFactory getInstance() {
return SingletonHolder.electricConsumerStrategyFactory;
}
public ElectricConsumerStrategy createStrategy(String type) {
return map.get(type);
}
}
优化之后
* 按维度查询小时用电量,清洗数据到 electric_hour_report
*
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean hourReport() {
for (String type : DIMENSION_TYPE) {
ElectricConsumerStrategy strategy = ElectricConsumerStrategyFactory.getInstance().createStrategy(type);
strategy.hourReport(type);
}
return true;
}
业务更复杂,代码命名进行优化,策略模式中套用策略模式。
package com.rjgf.report.other.design;
import com.rjgf.common.core.utils.MyDateUtil;
import com.rjgf.common.core.utils.SpringUtils;
import com.rjgf.common.core.utils.StringUtils;
import com.rjgf.common.redis.service.RedisService;
import com.rjgf.report.domain.ElectricDimensionHourReport;
import com.rjgf.report.domain.ElectricHourReport;
import com.rjgf.report.domain.so.ElectricConsumerDimensionGroupBySo;
import com.rjgf.report.domain.so.ElectricConsumerGroupBySo;
import com.rjgf.report.mapper.DwdElectricConsumeMapper;
import com.rjgf.system.api.domain.EnergyBuild;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static com.rjgf.common.core.constant.CacheConstants.BUILD_REDIS_CACHE_KEY;
import static com.rjgf.common.core.utils.MyDateUtil.*;
/**
* @author
* @date 2022/9/22 6:53
* @remark
*/
public class BuildElectricConsumerStrategy implements ElectricConsumerStrategy {
/**
* 建筑Map
*/
private Map<String, EnergyBuild> buildMap = null;
/**
* 策略模式,根据维度查询,清洗数据到 electric_hour_report
* @param masterDimension 维度
*/
@Override
public void hourReport(String masterDimension) {
Date nowDate = new Date();
String beforeDate = MyDateUtil.beforeHourToString(nowDate, 1);
Map<String, Integer> yymmddhh = MyDateUtil.getYYMMDDHH(beforeDate);
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils.getBean(DwdElectricConsumeMapper.class);
List<ElectricHourReport> list = new ArrayList<ElectricHourReport>(64);
refreshDimensionMap();
List<ElectricConsumerGroupBySo> electricConsumerSumList = dwdElectricConsumeMapper.hourReport(beforeDate, masterDimension);
for (ElectricConsumerGroupBySo sumSo : electricConsumerSumList) {
String dimensionName = getDimensionName(sumSo.getDimensionId());
if (StringUtils.isNotEmpty(dimensionName)) {
ElectricHourReport electricHourReport = new ElectricHourReport(dimensionName,
masterDimension,
yymmddhh.get(MY_YEAR),
yymmddhh.get(MY_MONTH),
yymmddhh.get(MY_DAY),
yymmddhh.get(MY_HOUR),
sumSo.getRecord(),
nowDate);
list.add(electricHourReport);
}
}
dwdElectricConsumeMapper.batchInsertElectricHourReport(list);
}
/**
*
* 策略模式,根据多维度查询 清洗数据到 electric_dimension_hour_report
* @param masterDimension 主维度
* @param slaveDimension 从维度
*/
@Override
public void hourDimensionReport(String masterDimension, String slaveDimension) {
Date nowDate = new Date();
String beforeDate = MyDateUtil.beforeHourToString(nowDate, 1);
Map<String, Integer> yymmddhh = MyDateUtil.getYYMMDDHH(beforeDate);
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils.getBean(DwdElectricConsumeMapper.class);
List<ElectricConsumerDimensionGroupBySo> groupBySoList = dwdElectricConsumeMapper
.hourDimensionReport(beforeDate, masterDimension, slaveDimension);
ElectricConsumerStrategy strategy = ElectricConsumerStrategyFactory.getInstance().createStrategy(slaveDimension);
refreshDimensionMap();
List<ElectricDimensionHourReport> list = new ArrayList<ElectricDimensionHourReport>(64);
for (ElectricConsumerDimensionGroupBySo so : groupBySoList) {
String mDimension = getDimensionName(so.getMasterDimensionId());
String sDimension = strategy.getDimensionName(so.getSlaveDimensionId());
if (StringUtils.isNotEmpty(mDimension) && StringUtils.isNotEmpty(sDimension)) {
ElectricDimensionHourReport electricDimensionHourReport = new ElectricDimensionHourReport(mDimension,
sDimension,
masterDimension,
yymmddhh.get(MY_YEAR),
yymmddhh.get(MY_MONTH),
yymmddhh.get(MY_DAY),
yymmddhh.get(MY_HOUR),
so.getRecord());
list.add(electricDimensionHourReport);
}
}
dwdElectricConsumeMapper.batchInsertElectricDimensionHourReport(list);
}
/**
*
* 策略模式,根据维度主键,获取维度名字
* @param dimensionId 维度主键
* @return 维度名字
*/
@Override
public String getDimensionName(String dimensionId) {
if (buildMap.containsKey(dimensionId)) {
return buildMap.get(dimensionId).getBuildName();
}
return null;
}
/**
*
* 策略模式,刷新维度map
*/
@Override
public void refreshDimensionMap() {
buildMap = SpringUtils.getBean(RedisService.class).getCacheMap(BUILD_REDIS_CACHE_KEY);
}
}
<select id="hourDimensionReport"
resultType="com.rjgf.report.domain.so.ElectricConsumerDimensionGroupBySo">
SELECT
${masterDimension} AS masterDimensionId ,
${slaveDimension} AS slaveDimensionId,
SUM(consume) AS record
FROM ods_hour_electric_consume
WHERE influxdb_time=#{datetime}
GROUP BY ${masterDimension},${slaveDimension}
</select>
优化后代码
/**
* 按多维度查询小时用电量,清洗数据到 electric_hour_report
*
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean hourDimensionReport() {
for (String masterDimension : DIMENSION_TYPE) {
for (String slaveDimension : DIMENSION_TYPE) {
if(!masterDimension.equals(slaveDimension)) {
ElectricConsumerStrategy strategy = ElectricConsumerStrategyFactory.getInstance().createStrategy(masterDimension);
strategy.hourDimensionReport(masterDimension,slaveDimension);
}
}
}
return true;
}
更多推荐
所有评论(0)