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

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4