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

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

定义

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

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

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

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

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

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

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

伪代码示例:

这是策略模式的一种变体:

把业务逻辑代码抽取到单独的函数里面,但如果有大量的条件,依然会造成类的膨胀和难以维护。

定义函数式接口

@FunctionalInterface

public interface MyFunction<P1, P2, P3, R> {

/**

*/

R exeFunction(P1 param1, P2 param2, P3 param3);

}

定义业务类

@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", (param1, param2, param3) -> this.exeKey1Fun(param1, param2, param3));

//

FUN_MAP.put("KEY2", (param1, param2, param3) -> this.exeKey2Fun(param1, param2, param3));

//

FUN_MAP.put("KEY3", (param1, param2, param3) -> this.exeKey3Fun(param1, param2, param3));

//

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

}

/**

* 使用

*/

public void myServiceExe(Key key, P1 param1, P2 param2, P3 param3){

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

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

// 替换通过if-else获取策略类,通过key从map里面获取

MyFunction fun = FUN_MAP.get(key);

if (fun != null) {

R rrr = fun.exeFunction(param1, param2, param3);

}

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

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

}

/**

* 定义具体实现

*/

private R exeKey1Fun(P1 param1, P2 param2, P3 param3){

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

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

}

/**

* 定义具体实现

*/

private R exeKey2Fun(P1 param1, P2 param2, P3 param3){

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

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

}

/**

* 定义具体实现

*/

private R exeKey3Fun(P1 param1, P2 param2, P3 param3){

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

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

}

}

相关推荐
非凡的世界15 分钟前
深入理解 PHP 框架里的设计模式
开发语言·设计模式·php
一叶飘零_sweeeet17 分钟前
深入 Spring 内核:解密 15 种设计模式的实战应用与底层实现
java·spring·设计模式
凤山老林21 分钟前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
彦楠25 分钟前
IDEA实用快捷键
java·ide·intellij-idea
豆沙沙包?32 分钟前
2025年--Lc197-077. 排序链表(链表,尾插法)--Java版
java·数据结构·链表
m0_6515939138 分钟前
深入理解软件设计中的协议与规范:从理论到Java实践
java·软件工程·代码规范·设计规范
Mr_WangAndy1 小时前
C++设计模式_行为型模式_状态模式State
c++·设计模式·状态模式
Knight_AL1 小时前
Tomcat 类加载器隔离机制的实际应用
java·tomcat
怪兽20141 小时前
请例举 Android 中常用布局类型,并简述其用法以及排版效率
android·面试
FreeBuf_1 小时前
Spring两大漏洞可导致泄露敏感信息及安全防护绕过(CVE-2025-41253/41254)
java·安全·spring