news 2026/8/22 9:05:50

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

作者头像

张小明

前端开发工程师

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/8/21 16:34:30

Thinkphp的吉他谱分享平台的设计与实现

目录研究背景与意义系统设计目标技术实现要点创新与特色应用价值项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理研究背景与意义 随着音乐爱好者的增多,吉他谱共享需求日益增长。传统分享方式效率低、资源分散,亟需一个专业…

作者头像 李华
网站建设 2026/8/21 16:34:27

SpringBoot+Vue 墙绘产品展示交易平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 随着城市化进程的加快和艺术文化的普及,墙绘艺术逐渐成为城市美化的重要组成部分,同时也催生了墙绘产品展示与交易的市场需求。传统的墙绘交易模式依赖线下渠道,存在信息不对称、交易效率低等问题。为了解决这些问题,本研究设…

作者头像 李华
网站建设 2026/8/21 16:34:36

【Git核心操作实战】从初始化到冲突解决与回滚(附完整演示)

文章目录目录引言环境准备一、仓库初始化与首次提交1.1 初始化 Git 仓库1.2 创建 .gitignore 文件1.3 首次提交技术解析二、分支创建与多轮小步提交2.1 切出 feature 分支2.2 2-3 次小步提交第一次提交:新增功能基础文件第二次提交:实现核心逻辑第三次提…

作者头像 李华
网站建设 2026/8/21 16:34:28

基于CNN的车牌识别网络

前期准备 这篇博客记录神经网络方法与应用的实验项目,项目开源链接:【免费】神经网络课程设计项目.zip资源-CSDN下载 数据集 数据集是我本人在百度飞桨网站上找到的,这个数据集整理的很全面详细,数据集信息包含10w张训练照片&a…

作者头像 李华
网站建设 2026/8/21 16:34:37

Java Web Web足球青训俱乐部管理后台系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 足球青训俱乐部管理后台系统的开发旨在解决传统足球青训俱乐部在管理学员信息、课程安排、教练分配等方面效率低下的问题。随着足球运动的普及和青训体系的完善,俱乐部需要一套高效、智能化的管理系统来优化运营流程。传统的人工记录和Excel表格管理方式容易导…

作者头像 李华
网站建设 2026/8/21 16:34:49

TypeScript 的本质并非类型,而是信任

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我静态类型悄悄修好的,不只是语法错误,而是你们的精神状态。老实说,我第一次听到 TypeScript 的时候,脑子里…

作者头像 李华