(十 四)趣學設計模式 之 策略模式!

在這里插入圖片描述

目錄

    • 一、 啥是策略模式?
    • 二、 為什么要用策略模式?
    • 三、 策略模式的實現方式
    • 四、 策略模式的優缺點
    • 五、 策略模式的應用場景
    • 六、 總結

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解模板方法模式請看: (十 三)趣學設計模式 之 模版方法模式!
?更多請看個人主頁: 碼熔burning

這篇文章帶你詳細認識一下設計模式中的策略模式

一、 啥是策略模式?

想象一下,你要去旅游 ??,可以選擇不同的交通方式:飛機 ??、火車 🚄、汽車 🚗。 你可以根據自己的需求和預算,選擇最合適的交通方式。

策略模式,就是用來解決算法選擇的問題! 它可以將算法封裝成獨立的策略類,并讓客戶端可以靈活地選擇不同的策略 🎁。

簡單來說,就是把不同的算法封裝起來,讓客戶端可以根據需要選擇不同的算法!

  • 你需要使用不同的算法來解決同一個問題: 就像你需要使用不同的排序算法來排序數據 🔢!
  • 你希望在運行時動態地選擇算法: 就像你需要根據不同的用戶選擇不同的推薦算法 🛍?!
  • 你希望避免大量的 if-else 語句: 就像你需要根據不同的條件執行不同的操作 😫!

二、 為什么要用策略模式?

用策略模式,好處多多 👍:

  • 提高代碼的靈活性: 可以動態地選擇不同的策略,使得代碼更加靈活 🤸!
  • 提高代碼的可維護性: 將算法封裝成獨立的策略類,使得代碼更加清晰易懂 💡!
  • 符合開閉原則: 可以在不修改現有代碼的情況下,增加新的策略,擴展功能 🆕!
  • 避免大量的 if-else 語句: 使得代碼更加簡潔優雅 💫!

三、 策略模式的實現方式

策略模式主要包含三個核心概念:

  • 策略接口(Strategy): 定義了策略的接口,聲明了所有策略都需要實現的方法 🤝!
  • 具體策略類(ConcreteStrategy): 實現了策略接口,封裝了具體的算法 ??!
  • 環境類(Context): 持有策略接口的引用,負責在運行時選擇并調用具體的策略 🏭!
// 策略接口:支付方式
public interface PaymentStrategy {void pay(int amount); // 支付
}// 具體策略類:支付寶支付
public class AlipayPayment implements PaymentStrategy {private String account; // 支付寶賬號public AlipayPayment(String account) {this.account = account;}@Overridepublic void pay(int amount) {System.out.println("使用支付寶賬號 " + account + " 支付 " + amount + " 元");}
}// 具體策略類:微信支付
public class WechatPayment implements PaymentStrategy {private String phone; // 微信綁定的手機號public WechatPayment(String phone) {this.phone = phone;}@Overridepublic void pay(int amount) {System.out.println("使用微信綁定的手機號 " + phone + " 支付 " + amount + " 元");}
}// 環境類:支付上下文
public class PaymentContext {private PaymentStrategy paymentStrategy; // 支付策略public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void pay(int amount) {paymentStrategy.pay(amount); // 調用支付策略的支付方法}
}// 客戶端
public class Client {public static void main(String[] args) {// 創建支付上下文PaymentContext paymentContext = new PaymentContext(new AlipayPayment("1234567890")); // 默認使用支付寶支付// 支付paymentContext.pay(100); // 使用支付寶支付 100 元// 切換支付方式paymentContext.setPaymentStrategy(new WechatPayment("9876543210")); // 切換到微信支付// 再次支付paymentContext.pay(200); // 使用微信支付 200 元}
}

代碼解釋

  • PaymentStrategy 接口定義了支付策略的接口,聲明了 pay 方法。
  • AlipayPayment 類和 WechatPayment 類實現了 PaymentStrategy 接口,封裝了支付寶支付和微信支付的算法。
  • PaymentContext 類是支付上下文,它持有 PaymentStrategy 接口的引用,負責在運行時選擇并調用具體的支付策略。
  • 客戶端通過 PaymentContext 類選擇支付方式,并調用 pay 方法進行支付。

輸出結果

使用支付寶賬號 1234567890 支付 100 元
使用微信綁定的手機號 9876543210 支付 200 元

四、 策略模式的優缺點

優點:

  • 提高代碼的靈活性 🤸!
  • 提高代碼的可維護性 💡!
  • 符合開閉原則 🆕!
  • 避免大量的 if-else 語句 💫!

缺點:

  • 增加了類的數量 😫!
  • 客戶端需要知道所有的策略 🤯!

五、 策略模式的應用場景

  • 排序算法: 可以使用不同的排序算法來排序數據 🔢!
  • 推薦算法: 可以根據不同的用戶選擇不同的推薦算法 🛍?!
  • 支付方式: 可以選擇不同的支付方式進行支付 💰!
  • 壓縮算法: 可以使用不同的壓縮算法來壓縮文件 🗜?!

六、 總結

  • 策略模式就像選擇困難癥的福音,算法隨心換,策略任你挑! 🎁
  • 核心概念包括策略接口、具體策略類和環境類! 🔑
  • 優點是提高代碼的靈活性、提高代碼的可維護性、符合開閉原則、避免大量的 if-else 語句! 👍
  • 缺點是增加了類的數量、客戶端需要知道所有的策略! 👎
  • 適用于需要使用不同的算法來解決同一個問題,或者需要在運行時動態地選擇算法的場景! 🎯

希望這篇文章能讓你徹底理解策略模式! 💯 祝你學習愉快! 😄
看完請看:(十 五)趣學設計模式 之 命令模式!

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

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

相關文章

探秘基帶算法:從原理到5G時代的通信變革【三】Turbo 編解碼

文章目錄 2.2 Turbo 編解碼2.2.1 基本概念與系統構成2.2.2 編碼過程分步解析交織器遞歸系統卷積編碼器復接器總結 2.2.3 譯碼算法分類與原理Turbo碼的強大主要來源于其解碼器理論基礎解碼過程詳解交織與解交織譯碼算法總結 2.2.4 Turbo碼的應用場景無線通信衛星通信深空通信 2.…

Yocto + 樹莓派攝像頭驅動完整指南

—— 從驅動配置、Yocto 構建,到 OpenCV 實戰 在樹莓派上運行攝像頭,在官方的 Raspberry Pi OS 可能很簡單,但在 Yocto 項目中,需要手動配置驅動、設備樹、軟件依賴 才能確保攝像頭正常工作。本篇文章從 BSP 驅動配置、Yocto 關鍵…

TCP協議(20250304)

1. TCP TCP: 傳輸控制協議(Transmission Control Protocol),傳輸層協議之一(TCP,UDP) 2. TCP與UDP UDP(用戶數據報協議) 面向數據報無連接不安全不可靠(盡最大努力交…

NModbus 連接到Modbus服務器(Modbus TCP)

1、在項目中通過NuGet添加NModbus,在界面中添加一個Button。 using NModbus.Device; using NModbus; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu…

【零基礎到精通Java合集】第十八集:多線程與并發編程-線程池與Callable/Future應用

課程標題:線程池與Callable/Future應用(15分鐘) 目標:掌握線程池的創建與管理,理解Callable任務與Future異步結果處理機制 0-1分鐘:課程引入與線程池意義 以“銀行窗口服務”類比線程池:復用固定資源(柜員)處理多任務(客戶)。說明線程池的核心價值——避免頻繁創建…

【leetcode hot 100 238】除自身以外數組的乘積

解法一:(左右乘積列表)利用索引左側所有數字的乘積和右側所有數字的乘積(即前綴與后綴)相乘得到答案。 class Solution {public int[] productExceptSelf(int[] nums) {int len nums.length;int[] L new int[len]; …

BUU44 [BJDCTF2020]ZJCTF,不過如此1 [php://filter][正則表達式get輸入數據][捕獲組反向引用][php中單雙引號]

題目: 我仿佛見到了一位故人。。。也難怪,題目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后: ......不太行,好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶?那 f…

[Web 安全] PHP 反序列化漏洞 —— POP 鏈構造思路

關注這個專欄的其他相關筆記:[Web 安全] 反序列化漏洞 - 學習筆記-CSDN博客 0x01:什么是 POP 鏈? POP 鏈(Payload On Purpose Chain)是一種利用 PHP 中的魔法方法進行多次跳轉以獲取敏感數據的技術。它通常出現在 CTF…

擴散語言模型:從圖像生成到文本創造的范式躍遷

近年來,擴散模型(Diffusion Models)在人工智能領域異軍突起,尤其在圖像生成任務中取得了令人矚目的成就,如 Stable Diffusion 等模型已成為生成高質量圖像的標桿。這種成功激發了研究者們的好奇心:擴散模型的魔力能否從視覺領域延伸至自然語言處理(NLP),為文本生成帶來…

大模型工程師學習日記(十):基于 LangChain 構建向量存儲和查詢 Qdrant

Qdrant介紹 Qdrant(讀作:quadrant /kwɑdr?nt/ n. 象限;象限儀;四分之一圓)是一個向量相似度搜索引擎。它提供了一個生產就緒的服務,具有方便的 API 來存儲、搜索和管理點 - 帶有附加載荷的向量。Qdrant專…

DeepSeek 助力 Vue3 開發:打造絲滑的網格布局(Grid Layout)

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄 Deep…

deepseek、騰訊元寶deepseek R1、百度deepseekR1關系

分析與結論 區別與聯系 技術基礎與定制方向: DeepSeek官網R1版本:作為基礎版本,通常保留通用性設計,適用于廣泛的AI應用場景(如自然語言處理、數據分析等)。其優勢在于技術原生性和官方直接支持。騰訊元寶…

外貿獨立站使用wordpress模板與定制哪個SEO效果好

使用WordPress模板搭建的外貿獨立站與定制站的SEO效果,可以從以下幾個方面進行分析: 1. 內容質量是SEO的核心 內容質量確實是SEO的關鍵,無論使用模板還是定制開發,優質、相關、原創的內容都是提升排名的基礎。內容能夠解決用戶問…

Golang語法特性總結

1.認識Golang代碼特性 package main //1.包含main函數的文件就是一個main包--當前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同時包含多個包 4.強制代碼風格:函數的 { 一定和函數名在同一行,否…

AI賦能校園安全:科技助力預防與應對校園霸凌

校園本應是學生快樂學習、健康成長的地方,然而,校園霸凌卻成為威脅學生身心健康的隱形“毒瘤”。近年來,隨著人工智能(AI)技術的快速發展,AI在校園安全領域的應用逐漸成為解決校園霸凌問題的新突破口。通過…

易語言模擬真人鼠標軌跡算法 - 防止游戲檢測

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序,它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言,原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢: 模擬…

運營商三要素API:構建安全信任的橋梁

引言 在數字經濟時代,身份驗證已成為各類業務場景的基礎需求。運營商三要素API作為一種高效的身份核驗工具,通過對接運營商數據,實現對用戶姓名、身份證號碼、手機號碼三項關鍵信息的實時校驗,為各行業提供可靠的身份認證解決方案…

Spring Boot 與 MyBatis 版本兼容性

初接觸Spring Boot,本次使用Spring Boot版本為3.4.3,mybatis的起步依賴版本為3.0.0,在啟動時報錯,報錯代碼如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…

GCN從理論到實踐——基于PyTorch的圖卷積網絡層實現

Hi,大家好,我是半畝花海。圖卷積網絡(Graph Convolutional Network, GCN)是一種處理圖結構數據的深度學習模型。它通過聚合鄰居節點的信息來更新每個節點的特征表示,廣泛應用于社交網絡分析、推薦系統和生物信息學等領…

MyBatis-Plus 邏輯刪除實現

在很多企業級應用中,數據刪除操作通常采用 邏輯刪除 的方式,而不是物理刪除。邏輯刪除指的是通過更新字段(例如 is_deleted 或 status)來標記數據為刪除狀態,而不是真的從數據庫中刪除記錄。這樣做的好處是保留數據的歷…