多种异构数据的分析设计方案3:聊聊策略模式+函数式接口+MAP

本文主要是介绍多种异构数据的分析设计方案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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070810

相关文章

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda