多种异构数据的分析设计方案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获取。

相关推荐
在未来等你18 分钟前
AI Agent设计模式 Day 2:Plan-and-Execute模式:先规划后执行的智能策略
设计模式·llm·react·ai agent·plan-and-execute
青云交35 分钟前
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用
java·spark·lstm·可视化·java 大数据·空气质量监测·污染溯源
森语林溪1 小时前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机
郝开1 小时前
Spring Boot 2.7.18(最终 2.x 系列版本)1 - 技术选型:连接池技术选型对比;接口文档技术选型对比
java·spring boot·spring
小猪咪piggy2 小时前
【项目】小型支付商城 MVC/DDD
java·jvm·数据库
知兀2 小时前
【Spring/SpringBoot】SSM(Spring+Spring MVC+Mybatis)方案、各部分职责、与Springboot关系
java·spring boot·spring
向葭奔赴♡2 小时前
Spring IOC/DI 与 MVC 从入门到实战
java·开发语言
早退的程序员2 小时前
记一次 Maven 3.8.3 无法下载 HTTP 仓库依赖的排查历程
java·http·maven
向阳而生,一路生花2 小时前
redis离线安装
java·数据库·redis
Tigshop开源商城系统2 小时前
Tigshop 开源商城系统 php v5.1.9.1版本正式发布
java·大数据·开源·php·开源软件