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

     

     

     

     

  • 相关阅读:
    设计模式之命令模式(行为型)
    SpaceX间接「颠覆」了手机?星链如何直连手机通信?
    232 node 项目部署流程
    Linux命令
    使用Spark SQL读取阿里云OSS的数据
    P1002 过河卒:图论动态规划入门
    Unity DOTS系列之Aspect核心机制分析
    Cytoscape 安装教程 | Network Data Integration, Analysis, and Visualization in a Box
    java-net-php-python-ssm宠物商店计算机毕业设计程序
    vue项目打包,使用externals抽离公共的第三方库
  • 原文地址:https://blog.csdn.net/quyunde/article/details/139747825