策略模式应用(内窥镜项目播放不同种类的视频)

新旧代码对比

策略模式

基本概念

策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并且使它们可以互相替换。策略模式允许客户端选择算法的具体实现,而不必改变客户端的代码。这样,客户端代码就可以根据需要在不同的算法之间切换。

在你提供的代码中,AnalysisPortCodeStrategy 接口就是一个策略接口,而实现该接口的具体类(可能有多个)就是策略类。每个具体的实现类都代表了一种不同的算法或策略,用于处理特定的业务逻辑。

在策略模式中,通常有三个角色:

策略接口(Strategy Interface): 定义一个策略的接口或抽象类,声明了具体策略类需要实现的方法。

public interface AnalysisPortCodeStrategy {List<AnalysisPortCodeInfoBO> getAnalysisPortCodeInfo(GeneralAnalysisQueryParamVO queryParamVO);// 其他方法...
}

具体策略类(Concrete Strategies): 实现了策略接口,具体定义了算法的实现。

public class StrategyA implements AnalysisPortCodeStrategy {@Overridepublic List<AnalysisPortCodeInfoBO> getAnalysisPortCodeInfo(GeneralAnalysisQueryParamVO queryParamVO) {// 具体算法A的实现// ...}
}public class StrategyB implements AnalysisPortCodeStrategy {@Overridepublic List<AnalysisPortCodeInfoBO> getAnalysisPortCodeInfo(GeneralAnalysisQueryParamVO queryParamVO) {// 具体算法B的实现// ...}
}

上下文类(Context): 包含一个策略接口的引用,可以在运行时切换不同的具体策略。

public class AnalysisContext {private AnalysisPortCodeStrategy strategy;public AnalysisContext(AnalysisPortCodeStrategy strategy) {this.strategy = strategy;}public void setStrategy(AnalysisPortCodeStrategy strategy) {this.strategy = strategy;}public List<AnalysisPortCodeInfoBO> executeStrategy(GeneralAnalysisQueryParamVO queryParamVO) {return strategy.getAnalysisPortCodeInfo(queryParamVO);}
}

学习文章:https://zhuanlan.zhihu.com/p/168682592

优点

使用策略模式的好处主要在于灵活性和可维护性。下面是一些使用策略模式的优势:

可扩展性: 策略模式使得你能够轻松地添加新的播放模式,而不必修改主类的代码。如果你要添加新的播放模式,只需创建新的策略类,而不会影响到其他部分的代码。

可维护性: 每个播放模式都被封装在独立的策略类中,这使得每个策略的逻辑都相对较小,易于理解和维护。这种分离使得修改或调整一个播放模式的行为变得更容易,而不必涉及主类的复杂逻辑。

解耦合: 主类与具体的播放策略相互解耦合,这意味着它们彼此不直接依赖。这种解耦合有助于保持代码的清晰度,减少代码的复杂性,并使得单独测试每个播放策略变得更容易。

动态切换: 由于策略是在运行时设置的,你可以动态地切换播放策略,而不需要停止整个应用程序。这对于需要根据不同条件或用户输入改变行为的情况很有用。

实战改代码

        //如果是2.play 初始化播放,初始化播放模式设置option参数//同时修正播放视频名称,将3D模式的上下左右交错全部取左右作为视频源if (fileBasicReq.getVideoName().contains("_3DM_TD.mp4")) {//上下模式if (fileBasicReq.getAction().equals("play")) {fileCplusplusReq.setOption("topDown");}//实际video都是原视频_3DM_LR.mp4,即07-05-58_3DM_LR.mp4,原视频为左右模式realVideoName = fileBasicReq.getVideoName().substring(0, 8) + "_3DM_LR.mp4";} else if (fileBasicReq.getVideoName().contains("_3DM_CL.mp4")) {//交错模式if (fileBasicReq.getAction().equals("play")) {fileCplusplusReq.setOption("cross");}//实际video都是原视频_3DM_LR.mp4,即07-05-58_3DM_LR.mp4,原视频为左右模式realVideoName = fileBasicReq.getVideoName().substring(0, 8) + "_3DM_LR.mp4";} else if (fileBasicReq.getVideoName().contains("_3DM_LR.mp4")) {//左右模式if (fileBasicReq.getAction().equals("play")) {fileCplusplusReq.setOption("leftRight");}} else if (fileBasicReq.getVideoName().contains("_2DM_LE.mp4") || fileBasicReq.getVideoName().contains("_2DM_RE.mp4")) {//2D模式if (fileBasicReq.getAction().equals("play")) {fileCplusplusReq.setOption("2d");}} else {log.error("非预期效果");throw new BusinessException("找不到对应的播放模式");}fileCplusplusReq.setVideoPath(fileBasicReq.getVideoRootPath().substring(1) + "/" + realVideoName);}

新代码

//如果是2.play 初始化播放,初始化播放模式设置option参数//同时修正播放视频名称,将3D模式的上下左右交错全部取左右作为视频源// 使用策略VideoPlayer videoPlayer = new VideoPlayer();if (fileBasicReq.getVideoName().contains("_3DM_TD.mp4")) {videoPlayer.setPlayStrategy(new TopDownStrategy());} else if (fileBasicReq.getVideoName().contains("_3DM_CL.mp4")) {videoPlayer.setPlayStrategy(new CrossStrategy());} else if (fileBasicReq.getVideoName().contains("_3DM_LR.mp4")) {videoPlayer.setPlayStrategy(new LeftRightStrategy());} else if (fileBasicReq.getVideoName().contains("_2DM_LE.mp4") || fileBasicReq.getVideoName().contains("_2DM_RE.mp4")) {videoPlayer.setPlayStrategy(new TwoDStrategy());} else {throw new BusinessException("找不到对应的播放模式");}if (fileBasicReq.getAction().equals("play")) {videoPlayer.playStrategy.apply(fileCplusplusReq, fileBasicReq);}}
package com.wg.strategy;import com.wg.model.FileBasicReq;
import com.wg.model.FileCplusplusReq;public interface VideoPlayStrategy {void apply(FileCplusplusReq fileCplusplusReq, FileBasicReq fileBasicReq);
}
package com.wg.strategy;public class VideoPlayer {public VideoPlayStrategy playStrategy;public void setPlayStrategy(VideoPlayStrategy playStrategy) {this.playStrategy = playStrategy;}
}

这里只写了其中一种策略

package com.wg.strategy;import com.wg.model.FileBasicReq;
import com.wg.model.FileCplusplusReq;// 上下模式策略
public class TopDownStrategy implements VideoPlayStrategy {@Overridepublic void apply(FileCplusplusReq fileCplusplusReq, FileBasicReq fileBasicReq) {fileCplusplusReq.setOption("topDown");modifyVideoNameFor3D(fileCplusplusReq, fileBasicReq);}private void modifyVideoNameFor3D(FileCplusplusReq fileCplusplusReq, FileBasicReq fileBasicReq) {// 修改视频名称逻辑,例如将"_3DM_TD.mp4"修改为对应的左右模式名称fileCplusplusReq.setVideoPath(fileBasicReq.getVideoRootPath().substring(1) + "/" + fileBasicReq.getVideoName().substring(0, 8) + "_3DM_LR.mp4");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/161412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国区域250米归一化植被指数数据集(2000-2022)

中国区域250米归一化植被指数数据集(2000-2022)数据集是中国区域2000至2022年月度归一化植被指数产品&#xff0c;空间分辨率250米&#xff0c;合成方式采用月最大值合成&#xff0c;每年12期&#xff0c;共275期。本产品是基于Aqua/Terra-MODIS卫星传感器MOD13Q1产品以及土地利…

寄存器、缓存、内存之间的关系和区别

https://blog.csdn.net/m0_46761060/article/details/124689209 目录 关系1、寄存器2、缓存&#xff08;Cache&#xff09; 2.1、寄存器和缓存的区别2.2、一级缓存和二级缓存3、内存 3.1、只读存储器 ROM&#xff08;Read Only Memory&#xff09;3.2、随机存储器 RAM&#xf…

基于LLM+场景识别+词槽实体抽取实现多轮问答

前言 随着人工智能技术的不断进步&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为技术前沿的热点。它们不仅能够理解和生成文本&#xff0c;还能在多种应用场景中实现复杂的交互。本文将深入探讨一段结合了大语言模型能力、意图识别和词槽实体抽取的Python代码&…

链表OJ--上

文章目录 前言一、反转链表二、移除链表元素三、链表中倒数第K个结点四、相交链表五、链表的中间结点 前言 一、反转链表 力扣206&#xff1a;反转链表- - -点击此处传送 思路图&#xff1a; 方法一&#xff1a;改变指向 方法二&#xff1a; 代码&#xff1a; //方法一 /…

十一、h.264编码

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 使用H.264编码对YUV视频进行压缩 ffmpeg -s 640x480 -pix_fmt yuv420p -i in.yuv -c:v libx264 out.h264 -c:v libx264是指定使用libx264作为编码器完整代码&#xff1a; H264EncodeThread.h #ifnd…

用HALCON标定助手对相机进行标定

任务要求&#xff1a; 已知相机镜头焦距f为8mm&#xff0c;相机单个CCD像素在水平和竖直两个方向上的尺寸均为3.75微米&#xff0c;相机为普通透光镜头和面阵相机&#xff0c;对相机进行标定&#xff0c;测量相机的内外参数。 操作步骤&#xff1a; 1. 在HALCON中运行gen_ca…

C#使用whisper.net实现语音识别(语音转文本)

目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址&#xff1a;https://huggingface.co/sandrohanea/whisper.net/tree…

Nginx高级

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

如何使用ArcGIS Pro进行坐标转换

不同来源的数据坐标系可能是不同的&#xff0c;为了统一使用这些数据就需要进行坐标转换&#xff0c;ArcGIS Pro作为专业的GIS软件&#xff0c;坐标转换功能肯定也是包含的&#xff0c;这里为大家介绍一下ArcGIS Pro如何进行坐标转换&#xff0c;希望能对你有所帮助。 数据来源…

【Exception】npm ERR! code UNABLE_TO_GET_ISSUER_CERT_LOCALLY

Talk is cheap, show me the code. 环境 | Environment kversionOSwindows 11nodev18.14.2npm9.5.0 报错日志 | Error log >npm create vitelatest Need to install the following packages:create-vite5.0.0 Ok to proceed? (y) y npm ERR! code UNABLE_TO_GET_ISSUER_…

2023亚太杯数学建模B题思路+模型+代码+论文

2023亚太地区数学建模A题思路&#xff1a;开赛后第一时间更新&#xff0c;获取见文末 名片 2023亚太地区数学建模B题思路&#xff1a;开赛后第一时间更新&#xff0c;获取见文末 名片 2023亚太地区数学建模C题思路&#xff1a;开赛后第一时间更新&#xff0c;获取见文末 名片…

idea修改行号颜色

前言 i当idea用了深色主题后&#xff0c;发现行号根本看不清&#xff0c;或者很模糊 例如下面这样 修改行号颜色 在IntelliJ IDEA中&#xff0c;你可以根据自己的喜好和需求定制行号的颜色。下面是修改行号颜色的步骤&#xff1a; 打开 IntelliJ IDEA。 转到 “File”&…

ChatGPT规模化服务的经验与教训

2022年11月30日&#xff0c;OpenAI发布ChatGPT&#xff0c;以很多人未曾预料的速度迅速走红。与此同时&#xff0c;由于短时间内用户量的暴涨&#xff0c;导致服务器过载&#xff0c;迫使OpenAI停止新用户的注册。 ChatGPT发布这一年&#xff0c;同样的情景发生了好几次。在最近…

opencv-图像金字塔

图像金字塔是一种图像处理技术&#xff0c;它通过不断降低图像的分辨率&#xff0c;形成一系列图像。金字塔分为两种类型&#xff1a;高斯金字塔和拉普拉斯金字塔。 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;&#xff1a; 高斯金字塔是通过使用高斯滤波和降采样&a…

专业远程控制如何塑造安全体系?向日葵“全流程安全闭环”解析

安全是远程控制的重中之重&#xff0c;作为国民级远程控制品牌&#xff0c;向日葵远程控制就极为注重安全远控服务的塑造。近期向日葵发布了以安全和核心的新版“向日葵15”以及同步发布《贝锐向日葵远控安全标准白皮书》&#xff08;下简称《白皮书》&#xff09;&#xff0c;…

使用微信小程序openMapApp接口,报错问题解决openMapApp:fail invaild coord

使用微信小程序的 openMapApp 接口时遇到了坐标无效的错误 (openMapApp:fail invalid coord)。这个错误通常是由于提供的地理坐标不符合预期的格式或范围而引起的&#xff1a; 坐标格式&#xff1a; 确保提供的坐标符合正确的格式。常见的格式是 "纬度,经度"&#xf…

【11月比赛合集】5场可报名的「创新应用」、「数据分析」和「程序设计」大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 创新应用赛&#xff08;1场比赛&#xff09;数据分析赛&#…

逸学java【初级菜鸟篇】9.3 Stream流

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 得益于Lambda所带来的函数式编程&#xff0c;引入了一个全新的Stream流概念&#xff08;就是都基本使用lambda的形式&#xff09;。 流处理 我们首先理解什么是流处理&#xff0c;它类似于sql语句&#xff0c;可以执行非常复…

【开源】基于Vue和SpringBoot的智能教学资源库系统

项目编号&#xff1a; S 050 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S050&#xff0c;文末获取源码。} 项目编号&#xff1a;S050&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

原理Redis-SkipList

SkipList ZipList和QuickList的共同特点是节省内存。在遍历元素时&#xff0c;只能从头到尾或从尾到头&#xff0c;所以在查找头尾元素性能还是不错的&#xff0c;但是中间元素查询的性能就会差。 **SkipList&#xff08;跳表&#xff09;**首先是链表&#xff0c;但与传统链表…