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

相关文章

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维