当前位置: 首页 > 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.jsqmd.com/news/217601/

相关文章:

  • 二十三种设计模式(二十三)--责任链模式
  • 基于Java+SpringBoot+SSM云与糖蛋糕购物平台系统(源码+LW+调试文档+讲解等)/云与糖蛋糕平台/云与糖蛋糕系统/云与糖购物平台/云与糖购物系统/蛋糕购物平台系统/云与糖蛋糕商城
  • 从底层逻辑到工程实践,深入理解C语言在计算机世界中的核心地位与持久价值
  • C语言的性能优化实践全解析:从编译器自动优化机制到程序员手动调优思维与工程经验总结
  • 大数据时代时序数据库选型指南:为何Apache IoTDB成为物联网场景首
  • win10下安装mysql最简方案
  • 月薪35-50k*16薪,中国又一行业新兴岗位在崛起!这将是程序员未来5年最好的就业方向!
  • 二十一、pinctrl子系统
  • 【人工智能学习-AI-MIT公开课第 17.-学习:boosting 算法】
  • 解析HTML表格嵌套问题
  • 基于Java+SpringBoot+SSM博客系统(源码+LW+调试文档+讲解等)/博客平台/博客软件/个人博客系统/博客网站系统/博客管理系统
  • Java Web 社区医院信息平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(1):再次起航】
  • SpringBoot+Vue 师生健康信息管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 实验一 安全威胁与攻击实验
  • 智慧停车解决方案
  • 【JavaSE】多线程之安全使用容器
  • Thinkphp的基于微服务教材征订系统(编号:
  • 基于SpringBoot+Vue的IT交流和分享平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 【JavaSE】文件基础与File类
  • SpringBoot+Vue “衣依”服装销售平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • Thinkphp的农贸市场摊位 夜市摊位租赁系统设计与实现
  • Claude Code 永动机:ralph-loop 无限循环迭代插件详解(安装 / 原理 / 最佳实践 / 避坑)
  • Java SpringBoot+Vue3+MyBatis 学科竞赛管理系统源码|前后端分离+MySQL数据库
  • Thinkphp的吉他谱分享平台的设计与实现
  • Java SpringBoot+Vue3+MyBatis 墙绘产品展示交易平台系统源码|前后端分离+MySQL数据库
  • Thinkphp的基于协同过滤算法的动漫推荐系统
  • 前后端分离IT交流和分享平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • SpringBoot + Aviator + 规则中心:轻量级表达式引擎实现营销优惠动态计算
  • Thinkphp的基于协同过滤算法的音乐推荐系统