当前位置: 首页 > news >正文

多种异构数据的分析设计方案1:使用策略模式+函数式接口

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

 

定义

策略模式(Strategy Pattern): 定义并封装一系列算法类,并且这些类可以相互替换,可以在运行时根据需要选择不同的算法,而不需要修改客户端流程代码。

 策略模式让算法独立于使用它的客户端而变化,也称为政策模式(Policy)。

 

 主要解决,在有多种算法流程相似的情况下,使用许多if...else分支所带来的代码复杂且难以维护的问题。

 

 关键代码:定义共通的函数时接口。

 

 何时使用:一个系统有许多业务分支类,执行的业务逻辑一致,只是具体实现不同。

 

 如何解决:将这些算法封装成一个一个的类,根据需求任意地组合替换。

 

 业务场景:自动化工厂,按照不同维度度统计分析电量消耗,例如:1.楼栋楼层,2.设备类型,3.产品类型, 4.小时日月年等。

 

 伪代码示例:

 

(每小时)

 

    @FunctionalInterface

    public interface HourFun<T,R> {

            /**

             * @explain analysis:Bean

             * @param T:待分析的参数bean

             * @return R:分析完毕得到的数据bean

             */

            R exeHour(T hourBean);

    }

(每天)

 

    @FunctionalInterface

    public interface DayFun<T,R> {

            /**

             * @explain analysis:Bean

             * @param T:待分析的参数bean

             * @return R:分析完毕得到的数据bean

             */

            R exeDay(T dayBean);

    }

 

(每月)

 

    @FunctionalInterface

    public interface MonthFun<T,R> {

            /**

             * @explain analysis:Bean

             * @param T:待分析的参数bean

             * @return R:分析完毕得到的数据bean

             */

            R exeMonth(T monthBean);

    }

 (每年)

 

    @FunctionalInterface

    public interface YearFun<T,R> {

            /**

             * @explain analysis:Bean

             * @param T:待分析的参数bean

             * @return R:分析完毕得到的数据bean

             */

            R exeYear(T yearBean);

    }

 

(业务流程逻辑:执行分析的框架方法) 此方法是策略模式中比较核心的点。

 

    public void analysis(ParamBean param, HourFun hourFun,DayFun dayFun, MonthFun monthFun,YearFun yearFun){

            ..............................

             ......其他业务逻辑代码 ......

            ..............................

            MAKE_HOUR: {

             ......其他业务逻辑代码 ......

                    hourFun.exeHour(param);

            }

            MAKE_DAY: {

                    dayFun.exeDay(param);

            }

            MAKE_MONTH: {

             ......其他业务逻辑代码 ......

                    monthFun.exeMonth(param);

            }

            MAKE_YEAR: {

             ......其他业务逻辑代码 ......

                    yearFun.exeYear(param);

            }

            ..............................

             ......其他业务逻辑代码 ......

            ..............................

    }

 

定义好各种单一统计方案之后,其实我们就要组装策略了。

 

加载到执行分析的框架方法中。

 

以下的每个Service,为符合函数式接口的具体实现类。

 

 具体执行(1.楼栋楼层,)

 

    analysis( param, hour1Service, day1Service, month1Service, year1Service);

 

具体执行(2.设备分类)

 

    analysis( param, hour2Service, day2Service, month2Service, year2Service);

 

具体执行(3.产品分类)

    

    analysis( param, hour3Service, day3Service, month3Service, year3Service);

 

 

 

 

 

相关文章:

  • 微服务项目雪崩的解决思路
  • 【吉林大学Java程序设计】第7章:对象的容纳
  • 了解Java的LinkedBlockingQueue
  • 什么是模板字符串?
  • Mathf.Approximately
  • grafana连接influxdb2.x做数据大盘
  • 深入学习html的步骤
  • 重磅新闻!狂揽120台订单!大运重卡唐山销服一体运营店盛大开业
  • nginx脚本原理if指令实现详解
  • Apache Doris 基础 -- 数据表设计(分层存储)
  • js原型链原理与查找机制
  • 2024年十大数据集成工具和软件应用场景解析
  • 将Typora中图片从指定路径移动到当前文件夹下(准确位置为:XX.md文件所在目录/XX.assets/)
  • 如何正确操作工业高温烤箱
  • 谷粒商城实战(042集群学习-mysql集群-主从同步)
  • 收藏网友的 源程序下载网
  • [case10]使用RSQL实现端到端的动态查询
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【译】理解JavaScript:new 关键字
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • github从入门到放弃(1)
  • python docx文档转html页面
  • 初识 beanstalkd
  • 和 || 运算
  • 前端知识点整理(待续)
  • 如何胜任知名企业的商业数据分析师?
  • 如何用vue打造一个移动端音乐播放器
  • 微服务核心架构梳理
  • 微信公众号开发小记——5.python微信红包
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 中文输入法与React文本输入框的问题与解决方案
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #android不同版本废弃api,新api。
  • #define
  • #HarmonyOS:Web组件的使用
  • (3)nginx 配置(nginx.conf)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (力扣)循环队列的实现与详解(C语言)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转) Android中ViewStub组件使用
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .aanva
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET性能优化(文摘)
  • .net专家(张羿专栏)
  • @AliasFor 使用
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [20190113]四校联考
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]