策略模式應用(內窺鏡項目播放不同種類的視頻)

新舊代碼對比

策略模式

基本概念

策略模式是一種行為設計模式,它定義了一系列算法,將每個算法封裝起來,并且使它們可以互相替換。策略模式允許客戶端選擇算法的具體實現,而不必改變客戶端的代碼。這樣,客戶端代碼就可以根據需要在不同的算法之間切換。

在你提供的代碼中,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.pswp.cn/news/161412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161412.shtml
英文地址,請注明出處:http://en.pswp.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;但與傳統鏈表…