策略模式应用(内窥镜项目播放不同种类的视频)
新旧代码对比
策略模式
基本概念
策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并且使它们可以互相替换。策略模式允许客户端选择算法的具体实现,而不必改变客户端的代码。这样,客户端代码就可以根据需要在不同的算法之间切换。
在你提供的代码中,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");}
}
相关文章:
策略模式应用(内窥镜项目播放不同种类的视频)
新旧代码对比 策略模式 基本概念 策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并且使它们可以互相替换。策略模式允许客户端选择算法的具体实现,而不必改变客户端的代码。这样,客户端代码就…...
【操作系统】Bochs安装和配置
Bochs是使用C编写的高度可移植开源IA-32(X86)PC模拟器,能在大多数流行的平台上运行。它包括模拟Intel x86 CPU、常见I/O设备和自定义BIOS。Bochs可以被编译以模拟许多不同的x86 CPU,从386早期到最新的x86-64英特尔和AMD处理器甚至…...
【Vue】Node.js的下载安装与配置
目录 一.下载安装 官网: 二.环境变量的配置 三.设置全局路径和缓存路径 四.配置淘宝镜像 五.查看配置 六.使用npm安装cnpm 一.下载安装 官网: https://nodejs.org/en/download 下载完之后,安装的时候一直点next即可,…...
C语言从入门到实战——数组和指针的强化练习题
数组和指针的强化练习题 前言1. sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析2.1 一维数组2.2 字符数组2.3 二维数组 3. 指针运算笔试题解析3.1 题目1:3.2 题目23.3 题目33.4 题目43.5 题目53.6 题目63.7 题目7 前言…...
经典滑动窗口试题(一)
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、将x减到0的最小操作数1、题目讲解2、讲解算法原理3、代码实现 二、无重复的最长子串1、题…...
【paddlepaddle】
安装paddlepaddle 报错 ImportError: /home/ubuntu/miniconda3/envs/paddle_gan/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /home/ubuntu/miniconda3/envs/paddle_gan/lib/python3.8/site-packages/paddle/fluid/libpaddle.so) 替换 /home/ubu…...
String 、StringBuffer 和 StringBuilder 的区别?
String 使用 String 声明一个字符串的时候,该字符串会存放在堆中的字符串常量池中。因为在java中所有的String 都是以常量表示,且由 final 修饰,因此在线程池中它的线程是安全的 且 不可变的 。每个 String 在被创建后就不再发生任何变化。 …...
【DevOps】Git 图文详解(六):Git 利器 - 分支
Git 利器 - 分支 1.分支 Branch2.分支指令 🔥3.分支的切换 checkout4.合并 merge & 冲突4.1 🔸 快速合并(Fast forward)4.2 🔸 普通合并4.3 处理冲突 <<<<<<< HEAD 5.变基 rebase 分支是从主…...
万界星空科技QMS质量管理系统介绍
QMS(Quality Management System)质量管理系统是五大基础系统之一,在工业企业中被广泛的应用,在质量策划、生产过程质量监督、体系审核和文档管理等业务上发挥着不可替代的作用。 一般制造业工厂现状:质量成本高&#x…...
C练习题_14
一、单项选择题(本大题共 20小题,每小题 2分,共 40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述不正确的是() A.一个C源程序可…...
解决方案 | 政策与技术加持,法大大电子劳动合同让人事管理更省心
政策加持, 助力劳动合同电子化推广 近年来,国家人社部多次发文,明确电子劳动合同法律效力,鼓励推广电子劳动合同全面应用,积极引导、支持企业和劳动者依法规范订立电子劳动合同,优化人力资源社会保障公共服…...
Linux基础命令5
su——切换用户命令 例如,切换到stu用户底下 而切换到管理员的命令就是下图 切换完的区别就是 stu——root $——# 退出——exit 关机与重启命令 如果在右上角直接点x号,就相当于把电源拔断了,这样做的次数多了,有可能系统就…...
springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(codeLW)
springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或…...
springboot宠物领养系统-计算机毕设 附源码 44261
springboot宠物领养系统 摘 要 网络发布信息有其突出的优点,即信息量大,资源丰富,更新速度快等,很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个网上宠物领养系统,为宠物爱好者提供一个信息…...
性能测试必备知识-使用MySQL存储过程构造大量数据:实例解析
在软件开发过程中,测试是一个不可或缺的环节。通过测试,我们可以发现并修复软件中的各种问题,提高软件的质量和稳定性。然而,手动编写大量的测试用例是一项耗时且容易出错的任务。为了解决这个问题,我们需要学会使用批…...
最新绿豆APP源码苹果CMS影视插件版本/原生JAVA源码+反编译开源+免授权
源码简介: 最新绿豆APP源码苹果CMS影视插件版本,它是原生JAVA源码反编译开源免授权,绿豆影视对接苹果CMS,它可以支持多功能自定义DIY页面布局。 1、新版绿豆视频APP视频6.1插件版反编译指南及教程 2、后端插件开源,可…...
SPSS多元对应分析
前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…...
Rust语言特性探秘:宏的魔力
大家好!我是lincyang。 今天我们继续深入探讨Rust语言中的一个有趣而强大的特性——宏(Macros)。 宏在Rust中扮演着特殊的角色,不仅提高了代码的灵活性,还增强了代码的可重用性。接下来,我们会通过具体的…...
2023最全的Web自动化测试介绍
做测试的同学们都了解,做Web自动化,我们主要用Selenium或者是QTP。 有的人可能就会说,我没这个Java基础,没有Selenium基础,能行吗?测试虽然属于计算机行业,但其实并不需要太深入的编程知识&…...
Unity 控制物体透明度变化
1.需求 给物体绑定一个脚本,这个脚本实现物体的透明度渐变变化,并且可以重置回原来的颜色。物体为Unity自带的材质Shader为Standard。 2.代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Transpare…...
开源风险运营自动化框架riskops:从事件驱动到SOAR实践
1. 项目概述:风险运营的自动化利器 最近在梳理团队的风险管理流程,发现一个很头疼的问题:风险事件的识别、评估、响应和复盘,大部分工作还停留在人工处理Excel表格和邮件沟通的阶段。一个中等规模的安全事件,从告警到闭…...
别再让NaN和Infinity搞砸你的C++程序了!手把手教你用好std::isfinite()做数值校验
别再让NaN和Infinity搞砸你的C程序了!手把手教你用好std::isfinite()做数值校验 在金融衍生品定价引擎的开发中,我曾目睹过一个由浮点数溢出引发的灾难性事故——某个交易日的波动率计算模块突然输出全零值,导致自动交易系统误判市场风险。事…...
3个关键步骤掌握MarkDownload:将网页内容高效转换为结构化知识库
3个关键步骤掌握MarkDownload:将网页内容高效转换为结构化知识库 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markd…...
XXMI启动器终极指南:如何一站式管理所有热门二次元游戏模组
XXMI启动器终极指南:如何一站式管理所有热门二次元游戏模组 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为管理《原神》、《崩坏:星穹铁道》、《鸣…...
本地语音识别终极指南:3步打造零延迟、高隐私的实时字幕工具
本地语音识别终极指南:3步打造零延迟、高隐私的实时字幕工具 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 在远程会议和在线学习成为日常的今天,你是否为云端语音识别的延迟和隐私问题而烦…...
从ArrayList到VectorSpecies:Java向量化开发全流程拆解,含GraalVM AOT+Linux perf火焰图调优实战
更多请点击: https://intelliparadigm.com 第一章:Java 25 向量 API 硬件加速概览 Java 25 正式将 jdk.incubator.vector 模块升级为标准 API(java.util.vector),标志着 JVM 首次原生支持跨平台向量化计算,…...
算法题(子串)
一、题目1、滑动窗口最大值(LC 239)2、最小覆盖子串(LC 76)二、题解1、滑动窗口最大值(LC 239)(1)分析方法一:暴力。两层for循环,内循环求每个窗口的最大元素…...
GitHub爆火!国内首个大模型实践教程《Dive into LLMs》,带你从零掌握大模型核心技术
最近,GitHub上一个名为"Dive into LLMs"的项目火了!短短时间内获得数千星标,成为大模型学习者的新宠。这究竟是什么样的神仙项目?为什么能在众多教程中脱颖而出?Dive into LLMs简介 Dive into LLMs 是由上海…...
打包 Android beeware briefcase
#安装 Android SDK,然后执行: briefcase create android briefcase build android *briefcase run android #连接安卓手机或模拟器运行 briefcase package android #打包为.APK...
企业安全风险管理新方法:RRR框架解析与应用
1. 企业安全风险管理的新视角:Riches, Ruins & Regulations方法解析在当今数字化时代,企业安全团队面临着一个根本性挑战:如何在有限的资源下,有效保护那些真正可能摧毁企业的关键业务风险?传统安全评估方法往往陷…...
