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

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

策略模式(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] 黑芝麻驾驶员监控算法

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

http://www.cnnetsun.cn/news/505987.html

相关文章:

  • Java SpringBoot+Vue3+MyBatis 学科竞赛管理系统源码|前后端分离+MySQL数据库
  • 大数据领域数据架构的发展趋势洞察
  • Apache Paimon多模态数据湖实践:从结构化到非结构化的技术演进
  • 开源版 Manus 火爆全网,狂揽 7.5 万 GitHub Star!
  • MATLAB实现大规模K-means聚类并保存分区结果到二进制文件
  • MATLAB实现图正则化稀疏编码的系数求解:Feature-Sign Search算法详解
  • 28.useMutationObserver
  • 精通plotnine:仅为特定数据组添加误差条
  • 提示工程架构师的“用户调研方法“:如何获取有效的Prompt设计需求
  • UE5 C++(15):宏 UFUNCTION() 修饰成员函数,BlueprintCallable,Category,BlueprintPure 纯函数,
  • [特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260108163835]
  • 注意,科学家、数学家不一定是智能学家
  • 【确认出席】叶光辉 盐城市住房公积金管理中心技术信息处副处长丨上海·1月14日
  • 全渠道 AI 推荐,如何终结创作者的“效率焦虑”?
  • Soundflower音频路由神器:彻底释放Mac音频系统的无限潜能
  • 谁说思维链越长越好?Yuan3.0 Flash开源:砍掉70%无效token,重构推理范式
  • WE Learn AI学习助手终极指南:5步轻松开启智能学习模式
  • Diffusers库安装
  • 巴菲特-芒格的神经形态计算投资:类脑计算的未来
  • 【2025最新高维多目标优化】基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法NMOPSO研究(Matlab代码实现)
  • Node.js 用beforeExit优雅关闭应用
  • Python纪念币预约自动化系统架构设计与实现
  • Soundflower音频路由:解锁Mac音频系统的隐藏潜能
  • Androidstudio成品项目-记单词背单词系统
  • C语言里面的中断程序:“exit()”和“return返回”
  • Soundflower终极指南:5步掌握Mac音频路由神器
  • Soundflower终极音频路由指南:免费实现专业级Mac音频管理
  • 【 n8n解惑】如何在 n8n 里同时操作数据库和调用外部 API,完成混合计算?
  • 西门子S7 - 1200 + V90PN 通过FB284控制4个轴及KTP700触摸屏程序实战
  • Thinkphp的协同过滤算法的“银海”音乐歌曲推荐系统