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

2023-11-28 01:30

本文主要是介绍策略模式应用(内窥镜项目播放不同种类的视频),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

新旧代码对比

策略模式

基本概念

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

在你提供的代码中,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.chinasem.cn/article/428838

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em