技術成神之路:設計模式(六)策略模式

1.介紹


策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一系列算法,封裝每一個算法,并使它們可以相互替換。策略模式使得算法的變化獨立于使用算法的客戶端。

2.主要作用


策略模式的主要作用是將算法或行為的選擇從使用者中分離出來,使得可以在運行時選擇不同的算法或行為。這種方式使得代碼更加靈活、可擴展。

3.解決的問題


策略模式的主要作用是通過定義一系列算法,使得它們可以相互替換,從而達到以下幾個目的:

  • 算法選擇:需要根據不同的條件選擇不同的算法時,可以使用策略模式避免復雜的條件語句。
  • 代碼復用:通過封裝不同的策略,減少代碼重復,提高可復用性。
  • 算法獨立:使得算法的變化獨立于使用它的客戶端,便于擴展和維護

4.模式原理


包含角色:

  1. 策略接口(Strategy):定義一系列算法的接口,所有具體策略都需要實現這個接口。
  2. 具體策略(ConcreteStrategy):實現策略接口的具體類,每個具體策略實現不同的算法。
  3. 上下文(Context):持有一個策略的引用,提供選擇和使用策略的功能,通常允許在運行時改變所用策略。

UML類圖:
在這里插入圖片描述
代碼示例:

使用策略模式來實現不同的排序算法。

// 策略接口
interface SortStrategy {void sort(int[] array);
}// 具體策略:快速排序
class QuickSort implements SortStrategy {public void sort(int[] array) {// 實現快速排序System.out.println("使用快速排序");}
}// 具體策略:冒泡排序
class BubbleSort implements SortStrategy {public void sort(int[] array) {// 實現冒泡排序System.out.println("使用冒泡排序");}
}// 上下文
class SortContext {private SortStrategy strategy;public void setStrategy(SortStrategy strategy) {this.strategy = strategy;}public void sort(int[] array) {strategy.sort(array);}
}// 使用
public class StrategyPatternExample {public static void main(String[] args) {SortContext context = new SortContext();int[] array = {5, 2, 9, 1};context.setStrategy(new QuickSort());context.sort(array); // 輸出:使用快速排序context.setStrategy(new BubbleSort());context.sort(array); // 輸出:使用冒泡排序}
}

策略模式結構不算復雜,更容易理解,在項目中使用的也比較多,再舉個我在項目中遇到的真實案例吧:

當時做跑步機軟件,有個需求是需要顯示心率值,而心率的來源有多個,比如:心率手柄,華為運動健康,還有其他App,他們之間還有優先級,華為運動健康第一,其他App第二,心率手柄第三,當三個心率源都有心率上報時,需要根據優先級進行顯示心率值,而在獲取心率值的時候 就只需在 策略模式所說的上下文 中get就行了,無需關心內部實現,至于策略動態切換,以及其他相關邏輯都包含在了上下文中。

當然,上述概念和舉例只是幫助你快速理解策略模式,以及在實際項目中遇到相應需求能想到它就可以了,真實的需求實現肯定不會像示例中那么簡單,記得靈活運用。

5.優缺點


優點

  • 靈活性:允許在運行時根據需要切換算法。
  • 可擴展性:新的算法可以很方便地加入到系統中,無需修改原有的代碼。
  • 避免條件語句:策略模式避免了復雜的條件語句,使代碼更加清晰。

缺點

  • 客戶端必須了解不同的策略:客戶端需要理解不同策略之間的差異,選擇合適的策略。

6.應用場景


  • 多種算法選擇:當需要根據不同條件選擇不同算法時,如排序、支付方式等。
  • 需要封裝一系列的算法:例如圖形繪制中,可以根據不同的圖形類型選擇不同的繪制策略。
  • 需要使用不同策略的對象:例如,系統中有多個對象需要使用不同的策略,但又希望統一管理。

這時候你是不是突然想拿自己項目中的某些功能練手了😎,各位不要隨便為了設計而修改現有完善模塊代碼哈,能就行 🤪,開個玩笑,設計模式就是為了方便我們寫出更容易維護,更適合自己的代碼的,而不是為了設計而設計的。

還有還有 說到這了再提一嘴😁

硬編碼和條件判斷(if…else 或 switch)

大家在項目中寫沒寫過 通過 if...elseswitch 來選擇不同的執行路徑,使用哪種算法,哪種解析方式,哪種網絡請求… 這中if...elseswitch選擇方式我們叫做硬編碼,當條件足夠多的時候,看著很不美觀,維護難度也大,恰恰這種類型的代碼,可以使用策略模式代替哦!

7.總結


策略模式通過將算法封裝為獨立的策略類,提供了一種靈活的方式來選擇和使用算法。它提高了代碼的可維護性和擴展性,符合面向對象設計的基本原則。在需要動態選擇算法和減少條件判斷時,策略模式是一種非常有效的解決方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45226.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45226.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45226.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試問題梳理:項目中防止配置中的密碼泄露-Jasypt

背景 想起面試的時候,面試官問我現在大家用Spring框架,數據庫、ES之類的密碼都是配置在配置文件中的,有很大的安全隱患,你有考慮過怎么解決嘛? 當時我回答是可以在項目啟動的過程中的命令行追加的方式,感覺…

Hello,World!(C++)

題目描述 編寫一個能夠輸出 Hello,World! 的程序。 提示&#xff1a; - 使用英文標點符號&#xff1b; Hello,World! 逗號后面沒有空格。 H 和 W 為大寫字母。 樣例 #1 樣例輸入 #1 無 樣例輸出 #1 Hello,World! &#xff08;1&#xff09; #include<bits/stdc.…

力扣題解( 讓字符串成為回文串的最少插入次數)

1312. 讓字符串成為回文串的最少插入次數 給你一個字符串 s &#xff0c;每一次操作你都可以在字符串的任意位置插入任意字符。 請你返回讓 s 成為回文串的 最少操作次數 。 「回文串」是正讀和反讀都相同的字符串。 思路&#xff1a; 本題要求的是最少插入次數&#xff0c;…

什么叫圖像的雙邊濾波,并附利用OpenCV和MATLB實現雙邊濾波的代碼

雙邊濾波&#xff08;Bilateral Filtering&#xff09;是一種在圖像處理中常用的非線性濾波技術&#xff0c;主要用于去噪和保邊。它在空間域和像素值域上同時進行加權&#xff0c;既考慮了像素之間的空間距離&#xff0c;也考慮了像素值之間的相似度&#xff0c;從而能夠有效地…

手機怎么看WiFi的IP地址

在如今數字化快速發展的時代&#xff0c;無線網絡已成為我們日常生活中不可或缺的一部分。無論是工作、學習還是娛樂&#xff0c;我們可能都離不開WiFi的陪伴。然而&#xff0c;在使用WiFi的過程中&#xff0c;有時我們可能需要查看其IP地址&#xff0c;以便更好地管理我們的網…

【動態規劃】背包問題 {01背包問題;完全背包問題;二維費用背包問題}

一、背包問題概述 背包問題(Knapsackproblem)是?種組合優化的NP完全問題。 問題可以描述為&#xff1a;給定一組物品&#xff0c;每種物品都有自己的重量和價格&#xff0c;在限定的總重量內&#xff0c;我們如何選擇&#xff0c;才能使得物品的總價格最?。 根據物品的個數…

鏈接追蹤系列-07.logstash安裝json_lines插件

進入docker中的logstash 容器內&#xff1a; jelexbogon ~ % docker exec -it 7ee8960c99a31e607f346b2802419b8b819cc860863bc283cb7483bc03ba1420 /bin/sh $ pwd /usr/share/logstash $ ls bin CONTRIBUTORS Gemfile jdk logstash-core modules tools x-pack …

語音識別概述

語音識別概述 一.什么是語音&#xff1f; 語音是語言的聲學表現形式&#xff0c;是人類自然的交流工具。 圖片來源&#xff1a;https://www.shenlanxueyuan.com/course/381 二.語音識別的定義 語音識別&#xff08;Automatic Speech Recognition, ASR 或 Speech to Text, ST…

基于RAG大模型的變電站智慧運維-第十屆Nvidia Sky Hackathon參賽作品

第十屆Nvidia Sky Hackathon參賽作品 1. 項目說明 變電站是用于變電的設施&#xff0c;主要的作用是將電壓轉化&#xff0c;使電能在輸電線路中能夠長距離傳輸。在電力系統中&#xff0c;變電站起到了極為重要的作用&#xff0c;它可以完成電能的負荷分配、電壓的穩定、容錯保…

電影購票小程序論文(設計)開題報告

一、課題的背景和意義 隨著互聯網技術的不斷發展&#xff0c;人們對于購票的需求也越來越高。傳統的購票方式存在著排隊時間長、購票流程繁瑣等問題&#xff0c;而網上購票則能夠有效地解決這些問題。電影購票小程序是網上購票的一種新型應用&#xff0c;它能夠讓用戶隨時隨地…

06.截斷文本 選擇任何鏈接 :root 和 html 有什么區別

截斷文本 對超過一行的文本進行截斷,在末尾添加省略號(…)。 使用 overflow: hidden 防止文本超出其尺寸。使用 white-space: nowrap 防止文本超過一行高度。使用 text-overflow: ellipsis 使得如果文本超出其尺寸,將以省略號結尾。為元素指定固定的 width,以確定何時顯示省略號…

Selenium WebDriver中的顯式等待與隱式等待:深入理解與應用

在自動化測試中&#xff0c;尤其是在使用Selenium WebDriver進行Web應用的自動化測試時&#xff0c;等待元素加載完成是一個常見的需求。Selenium提供了兩種等待機制來處理這一問題&#xff1a;顯式等待&#xff08;Explicit Wait&#xff09;和隱式等待&#xff08;Implicit W…

筆記 4 :linux 0.11 中繼續分析 0 號進程創建一號進程的 fork () 函數

&#xff08;27&#xff09;本條目開始&#xff0c; 開始分析 copy_process () 函數&#xff0c;其又會調用別的函數&#xff0c;故先分析別的函數。 get_free_page &#xff08;&#xff09; &#xff1b; 先 介紹匯編指令 scasb &#xff1a; 以及 指令 sstosd &#xff1a;…

什么是架構設計師?定義、職責和任務,全方位解析需要具備的專業素質

目錄 1. 架構設計師的定義 2. 架構設計師的職責和任務 2.1 系統架構設計 2.1.1 模塊劃分 2.1.2 接口設計 2.1.3 通信方式 2.2 技術選型與決策 2.2.1 技術評估 2.2.2 技術選型 2.2.3 技術決策 2.3 性能優化與調優 2.3.1 性能分析 2.3.2 性能優化 2.3.3 性能調優 …

基于BitMap的工作日間隔計算

背景問題 在我們實際開發過程中&#xff0c;時常會遇到日期的間隔計算&#xff0c;即計算多少工作日之后的日期&#xff0c;在不考慮法定節假日的情況下也不是那么復雜&#xff0c;畢竟周六、周日是相對固定的&#xff0c;Java語言也提供了豐富的類來處理此問題。 然而&#x…

MVVM和MVC的原理以及它們的區別

MVVM&#xff08;Model-View-ViewModel&#xff09;和 MVC&#xff08;Model-View-Controller&#xff09;是兩種常見的前端架構模式&#xff0c;它們都旨在幫助組織和管理復雜的前端應用程序邏輯和視圖層。 MVC&#xff08;Model-View-Controller&#xff09; 原理&#xff1…

視圖庫對接系列(GA-T 1400)十七、視圖庫對接系列(本級)采集設備獲取

背景 這一章的話,我們寫寫如何獲取采集設備獲取,之前其實也有說過類似的 就我們訂閱的時候如果subscribeDetail=3的話,下級就會主動給我們推送采集設備。但這里的話,是下級主動推,如果下級平臺不支持,或者說可能因為某個原因推的不全,怎么辦? 我們能否主動獲取采集設備…

WPF學習(4) -- 數據模板

一、DataTemplate 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;DataTemplate 用于定義數據的可視化呈現方式。它允許你自定義如何展示數據對象&#xff0c;從而實現更靈活和豐富的用戶界面。DataTemplate 通常用于控件&#xff08;如ListBox、…

知識圖譜和 LLM:利用 Neo4j 實現大型語言模型

這是關于 Neo4j 的 NaLLM 項目的一篇博客文章。這個項目是為了探索、開發和展示這些 LLM 與 Neo4j 結合的實際用途。 2023 年,ChatGPT 等大型語言模型 (LLM) 因其理解和生成類似人類的文本的能力而風靡全球。它們能夠適應不同的對話環境、回答各種主題的問題,甚至模擬創意寫…

NSSCTF中24網安培訓day1中web的題目

我flag呢 直接查看源代碼即可CtrlU [SWPUCTF 2021 新生賽]Do_you_know_http 用Burpsuite抓包&#xff0c;之后在User-agent下面添加XFF頭&#xff0c;即X-Forwarded-For:127.0.0.1 [SWPUCTF 2022 新生賽]funny_php 首先是php的弱比較&#xff0c;對于num參數&#xff0c;我們…