news 2026/2/9 8:48:11

二十三种设计模式(二十二)--策略模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二十三种设计模式(二十二)--策略模式

策略模式(Strategy)

如果某一个程序中用到各种各样的算法, 这些算法如果预编译的程序中会非常臃肿, 此时策略模式就可以实现各种算法的灵活取用
实际需求如下:
我有一个车载道路安全应用程序, 需要FDW道路前向预警功能, TSR道路标志牌识别功能, DMS驾驶员监控功能, 分别对应三种类型的算法模型, 而这三种算法模型由不同的供应商提供, 具体采用哪个供应商的算法要根据实际测试的效果来评判, 但在我们的应用中要提供能够兼容所有算法的接口
此时用策略模式会是一个非常好的选择, 代码实现如下:

// 前向预警interfaceFDW{voidreference();}// 交通标识牌识别interfaceTSR{voidpredict();}// 驾驶员监控interfaceDMS{voidforward();}classDesayFDWimplementsFDW{@Overridepublicvoidreference(){System.out.println("[FDW] 德赛西威道路前向预警算法");}}classDesayTSRimplementsTSR{@Overridepublicvoidpredict(){System.out.println("[TSR] 德赛西威道路标识牌识别算法");}}classHorizonFDWimplementsFDW{@Overridepublicvoidreference(){System.out.println("[FDW] 地平线道路前向预警算法");}}classHorizonTSRimplementsTSR{@Overridepublicvoidpredict(){System.out.println("[TSR] 地平线道路标识牌识别算法");}}classHorizonDMSimplementsDMS{@Overridepublicvoidforward(){System.out.println("[DMS] 地平线驾驶员监控算法");}}classBlackSesameTSRimplementsTSR{@Overridepublicvoidpredict(){System.out.println("[TSR] 黑芝麻道路标识牌识别算法");}}classBlackSesameDMSimplementsDMS{@Overridepublicvoidforward(){System.out.println("[DMS] 黑芝麻驾驶员监控算法");}}// 算法控制器, 提供动态的设置算法和运行算法进行计算的能力classAIAlgorithmController{FDWfdw;DMSdms;TSRtsr;publicvoidsetFdw(FDWfdw){this.fdw=fdw;}publicvoidsetDms(DMSdms){this.dms=dms;}publicvoidsetTsr(TSRtsr){this.tsr=tsr;}publicvoidrunFdwInfer(){fdw.reference();}publicvoidrunTsrInfer(){tsr.predict();}publicvoidrunDmsInfer(){dms.forward();}}

上述代码示例中, 有DMS, TSR, FDW三种策略, 针对三种策略, 各个供应商提供了7种算法, 最终所有的算法在控制器中得到灵活取用
实际调用示例如下:

publicclassStrategyPattern{publicstaticvoidmain(String[]args){// 通过算法控制器AIAlgorithmController动态地选择合适的算法AIAlgorithmControlleraiController=newAIAlgorithmController();aiController.setDms(newBlackSesameDMS());aiController.setTsr(newHorizonTSR());aiController.setFdw(newDesayFDW());aiController.runFdwInfer();aiController.runTsrInfer();aiController.runDmsInfer();}}

输出:

[FDW] 德赛西威道路前向预警算法 [TSR] 地平线道路标识牌识别算法 [DMS] 黑芝麻驾驶员监控算法

策略模式和状态模式在代码组织上非常相似, 如果状态模式将状态暴露给调用者, 那其实就和策略模式没什么区别了. 所以两者的关键区别就在这里

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 10:48:27

Java SpringBoot+Vue3+MyBatis 学科竞赛管理系统源码|前后端分离+MySQL数据库

摘要 随着信息技术的快速发展,学科竞赛作为高校人才培养的重要环节,其管理效率与信息化水平直接影响竞赛的公平性和参与度。传统的学科竞赛管理多依赖人工操作,存在报名流程繁琐、数据统计滞后、信息共享困难等问题。为解决这些问题&#xff…

作者头像 李华
网站建设 2026/2/9 8:48:06

大数据领域数据架构的发展趋势洞察

大数据领域数据架构的发展趋势洞察:从传统到新兴的演进之路 摘要/引言 在当今数字化时代,大数据的规模和复杂性呈指数级增长,对数据架构提出了前所未有的挑战。传统的数据架构在应对海量、高维、实时性的数据时逐渐显得力不从心。本文旨在深…

作者头像 李华
网站建设 2026/2/8 12:20:30

Apache Paimon多模态数据湖实践:从结构化到非结构化的技术演进

在近期的 Streaming Lakehouse Meetup Online EP.2|Paimon StarRocks 共话实时湖仓 直播中,Apache Paimon PMC 成员/阿里云数据湖资深工程师叶俊豪带来了关于 Paimon 多模态数据湖的深度技术分享。随着大模型训练对数据规模与多样性的要求不断提升&…

作者头像 李华
网站建设 2026/2/9 8:47:59

开源版 Manus 火爆全网,狂揽 7.5 万 GitHub Star!

2026 新年刚开始,科技圈最重磅的消息,莫过于 Meta 豪掷 20 亿美金,收购号称“通用智能体”的 Manus。此前也体验过 Manus,不得不说其自动化能力确实惊艳。只需给它一个目标,就能帮我们自动操作电脑,把事情干…

作者头像 李华
网站建设 2026/2/9 8:47:57

MATLAB实现大规模K-means聚类并保存分区结果到二进制文件

在图像检索、特征量化以及向量压缩等任务中,经常需要对海量高维特征向量(如SIFT、GIST或深度学习提取的特征)进行K-means聚类,以构建视觉词袋模型或进行产品量化(Product Quantization)。当聚类中心数达到数百到数千、数据量达到百万级别时,标准的kmeans函数往往速度较慢…

作者头像 李华
网站建设 2026/2/9 8:47:54

MATLAB实现图正则化稀疏编码的系数求解:Feature-Sign Search算法详解

在稀疏编码任务中,学习稀疏系数是核心步骤之一。传统的L1正则最小二乘问题(L1LS)可以通过多种方式求解,而Feature-Sign Search算法是一种高效的近似优化方法,它通过主动集策略和符号约束,快速求解带L1正则的二次规划问题。 今天我们来深入探讨一个扩展版本的稀疏系数学习…

作者头像 李华