本文主要是介绍多种异构数据的分析设计方案3:聊聊策略模式+函数式接口+MAP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
多种异构数据的分析设计方案3:聊聊策略模式+函数式接口+MAP
定义
策略模式(Strategy Pattern): 定义并封装一系列算法类,并且这些类可以相互替换,可以在运行时根据需要选择不同的算法,而不需要修改客户端流程代码。
策略模式让算法独立于使用它的客户端而变化,也称为政策模式(Policy)。
主要解决,在有多种算法流程相似的情况下,使用许多if...else分支所带来的代码复杂且难以维护的问题。
关键代码:定义共通的函数时接口。
何时使用:一个系统有许多业务分支类,执行的业务逻辑一致,只是具体实现不同。
如何解决:将这些算法封装成一个一个的类,根据需求任意地组合替换。
业务场景: 智能工厂升级改造,解决历史遗留的不同系统之间数据隔离问题,并统计分析各个系统生产制造运行数据指标。
各个系统数据库设计的表结构不同,各字段名称不同,但都有一定规律。现要将数据进行分析汇总到同一个分析表里。
示例:数据库A,表设计。
CREATE TABLE demo.table_a (
id int IDENTITY(1,1) ,
product_shop_id int (生产车间ID),
robot_id varchar(50) (机器人ID),
robot_type int (机器人类型),
qr_code varchar(50) (条形码),
ok_ng_flag int (OK/NG判断),
date_time datetime (生产时间)
);
示例:数据库B,表设计。
CREATE TABLE demo.table_a (
id int IDENTITY(1,1) ,
product_line_id int (生产线ID),
assemble_id varchar(50) (机器工位ID),
assemble_type int (机器工位型),
prodct_code varchar(50) (生产条形码),
judge_flag int (OK/NG判断),
date_time datetime (生产时间)
);
示例:数据库C,D,E,F表设计.........。
数据分析汇总表
CREATE TABLE demo.statistic (
ID int IDENTITY(1,1),
product_date date(生产日期),
flow_line_id int (生产流水线ID),
assemble_id varchar(50) (机器工位ID),
assemble_type int (机器工位型),
count_all int(OK总数) ,
count_ng int (NG总数)
);
伪代码示例:
定义字段转换使用的函数式接口
@FunctionalInterface
public interface MyFunction {
/**
*/
ColumnBean makeColumnExe();
}
定义业务类
@Service
public class MyServiceImpl{
// 使用 map 存储具体策略执行逻辑函数
// 特点:通过key从map里面获取,替换通过if-else获取策略类,减少了复杂度,
// 特点:减少class,但增加 method,增加新的策略函数,既可以定义在新class里面,也可以写在已有的class里面。
private Map<String, MyFunction> FUN_MAP = new HashMap<>();
@PostConstruct
public void beanInit() {
//
FUN_MAP.put("KEY1", () -> this.makeColumn1());
//
FUN_MAP.put("KEY2", () -> this.makeColumn2());
//
............
}
/**
* 使用
*/
public void myServiceExe(Key key){
............
............
// 替换通过if-else获取策略类,通过key从map里面获取
MyFunction fun = FUN_MAP.get(key);
if (fun != null) {
ColumnBean columnBean = fun.makeColumnExe();
//使用参数做统计分析
//在SQL,动态拼接字段,表名称等
statisticService.statisticDaily(columnBean);
}
............
............
}
/**
* 定义具体实现
*/
private ColumnBean makeColumn1(){
............
columnBean = new columnBean();
columnBean.setIdColumn("id");
columnBean.setProductDateColumn("date_time");
columnBean.setFlowLineIdColumn("product_shop_id");
columnBean.setAssembleIdColumn("robot_id");
columnBean.setAssembleTypeColumn("robot_type");
columnBean.setJudgeColumn("ok_ng_flag");
............
}
/**
* 定义具体实现
*/
private ColumnBean makeColumn2(){
............
columnBean = new columnBean();
columnBean.setIdColumn("ID");
columnBean.setProductDateColumn("date_time");
columnBean.setFlowLineIdColumn("product_line_id");
columnBean.setAssembleIdColumn("assemble_id");
columnBean.setAssembleTypeColumn("assemble_type");
columnBean.setJudgeColumn("judge_flag");
............
}
}
或者创建数据库,把makeColumn的相关配置信息,落实到数据库中。取用时根据KEY获取。
这篇关于多种异构数据的分析设计方案3:聊聊策略模式+函数式接口+MAP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!