設計模式從入門到精通之(六)策略模式

策略模式:讓算法靈活切換的秘密武器

在日常開發中,算法的選擇常常是程序設計的核心,比如支付方式的選擇、排序邏輯的切換、促銷活動的動態調整等。當需求變化時,我們需要在多個算法之間切換,但又不希望修改已有代碼。如何做到?

策略模式正是為這種場景設計的解決方案。


1. 什么是策略模式?

策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一系列算法,并將每種算法封裝起來,使它們可以互相替換,同時保證算法的獨立性和靈活性。

用一句話概括:策略模式就是讓不同的算法可以像插件一樣自由切換,而無需修改調用者的代碼。


2. 現實生活中的策略模式

想象一下,你在網上購物時選擇支付方式。系統提供了多種支付方式:信用卡、支付寶、微信等。你只需選擇其中一種,系統會根據你的選擇完成支付。
請添加圖片描述

在這個場景中:

  1. 支付方式是不同的算法。
  2. 系統作為調用者無需關心支付細節,只需根據你的選擇調用對應的支付算法。

3. 策略模式的代碼實現

以支付系統為例,展示策略模式的實現。

3.1 定義策略接口

首先,定義一個通用的支付策略接口。

interface PaymentStrategy {void pay(double amount);
}

3.2 實現具體的策略

創建具體的支付方式,比如信用卡支付和支付寶支付。

class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paid $" + amount + " using Credit Card.");}
}class AlipayPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paid $" + amount + " using Alipay.");}
}

3.3 創建上下文類

上下文類負責維護對策略對象的引用,并根據需要調用具體的策略。

class PaymentContext {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void executePayment(double amount) {if (paymentStrategy == null) {System.out.println("No payment method selected!");} else {paymentStrategy.pay(amount);}}
}

3.4 客戶端代碼

在客戶端中,動態切換支付方式。

public class Main {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 使用信用卡支付context.setPaymentStrategy(new CreditCardPayment());context.executePayment(100);// 切換到支付寶支付context.setPaymentStrategy(new AlipayPayment());context.executePayment(200);}
}

運行結果:

Paid $100 using Credit Card.
Paid $200 using Alipay.

4. 策略模式的優缺點

優點:

  1. 算法獨立:每種策略都有自己的類,便于維護和擴展。
  2. 遵循開閉原則:新增算法時無需修改已有代碼。
  3. 靈活切換:可以根據運行時條件動態更換算法。

缺點:

  1. 增加類數量:每種策略都需要一個獨立的類。
  2. 客戶端需要了解策略:客戶端需要知道有哪些策略,并顯式地選擇。

5. 策略模式的應用場景

  1. 支付系統:支持多種支付方式。
  2. 排序算法:動態選擇不同的排序邏輯。
  3. 促銷活動:根據用戶類型或節日選擇不同的促銷策略。
  4. 游戲開發:角色技能或 AI 行為的動態切換。

6. 總結

策略模式通過將算法封裝成獨立的類,極大地提高了代碼的靈活性和可擴展性。它非常適合那些需要動態切換算法的場景,但需要注意控制策略類的數量,避免代碼過于臃腫。

下一篇專欄,我們將繼續探討另一種行為型模式:責任鏈模式,看它如何實現請求處理的鏈式分發。


思考問題:
在復雜系統中,如何優雅地管理眾多策略類?歡迎留言討論!

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

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

相關文章

安裝MATLAB205軟件記錄

安裝MATLAB2025 一臺電腦可以安裝多個版本的MATLAB; 下載資源 微信公眾平臺-MATLAB R2025a v25.1下載及安裝教程 安裝步驟 解壓, 壓縮文件大小為13.8GB 裝載 選中setup.exe右鍵單擊以管理員身份運行 我有文件安裝密鑰 接受許可條款 復制粘貼密鑰 63733-59078-50866-02827-…

MySQL 基礎架構(一):SQL語句的執行之旅

MySQL系列文章 MySQL 基礎架構(一):SQL語句的執行之旅 你是否好奇過,一條看似簡單的SQL查詢語句,在MySQL內部究竟經歷了怎樣的"奇幻之旅"?從連接建立到結果返回,MySQL是如何層層處理、…

Spring Boot 使用 Druid 連接池極致優化

在 Spring Boot 中使用 Druid 連接池進行極致優化,需要從核心參數調優、監控體系搭建、安全增強、連接管理及性能適配等多個維度綜合考慮。以下是分階段的詳細優化策略:一、基礎環境準備確保使用最新穩定版 Druid(截至 2024 年推薦 1.2.38&am…

【Big Data】Apache Kafka 分布式流處理平臺的實時處理實踐與洞察

目錄 一、Apache Kafka是什么 二、Kafka的誕生背景 三、Kafka的架構設計 四、Kafka解決的技術問題 五、Kafka的關鍵特性 六、Kafka與其他消息隊列系統的對比 七、Kafka的工作原理 八、Kafka的部署與使用方法 1. 集群部署 2. 生產者與消費者配置 3. 安全配置 4. 監控…

23種設計模式——裝飾器模式(Decorator Pattern)詳解

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。 🍎個人主頁:Meteors.的博客 💞當前專欄:設計模式 ?特色專欄:知識分享 &#x…

《sklearn機器學習——聚類性能指標》Davies-Bouldin Index (戴維斯-博爾丁指數)

Davies-Bouldin Index (戴維斯-博爾丁指數)簡介 概念與定義 Davies-Bouldin Index是由David L. Davies和Donald W. Bouldin于1979年提出的一種用于評估聚類算法效果的內部指標。它通過計算每個簇內數據點之間的相似性和不同簇中心點的距離來衡量聚類結果的質量。DBI的值越低&am…

QT的學習(一)

前言:距離上一次摸QT已經快10年了,時光匆匆,現在已經到6.9版本了 一、安裝QT 1.1、下載鏈接 https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ 這是國內鏡像,比官網快很多了,官網那個…

亞洲數字能源獨角獸的 “安全密碼”:Parasoft為星星充電筑牢軟件防線

當你在充電樁前等待愛車滿電時,是否想過:這看似簡單的充電過程,背后藏著多少軟件代碼的精密協作?作為亞洲數字能源領域的頭部企業,星星充電用 “移動能源網” 連接著千萬用戶與新能源世界,而支撐這一切的&a…

安裝Codex(需要用npm)

查看已經安裝的包 npm list -g --depth0 npm uninstall -g anthropic-ai/claude-code 如果要卸載什么東西 安裝Codex :npm i -g openai/codex https://openai.com/zh-Hant/codex/ 之后登錄gpt賬號,完成后就是下面的樣子

HarmonyOS 開發學習分享:從入門到認證的完整路徑

HarmonyOS 開發學習分享:從入門到認證的完整路徑 大家好!我是趙老師,一個深耕鴻蒙生態的開發者。最近剛通過鴻蒙生態賦能資源豐富度建設活動的講師認證,想和大家分享一下 HarmonyOS 開發的學習心得和認證經驗。 我的鴻蒙開發經歷作…

使用Spring Boot DevTools快速重啟功能

背景 在Spring Boot項目中,修改一些簡單的代碼后,每次手動終止并啟動整個項目比較繁瑣且消耗時間。Spring Boot DevTools 提供了開發時的熱重啟功能,使得在開發過程中修改代碼后可以快速生效,而無需手動重啟整個應用,可…

7.4Element Plus 分頁與表格組件

el-pagination el-table 這兩個組件是后臺管理系統中最常用的數據展示與交互組合&#xff0c;通常配合使用實現 分頁加載、排序、篩選、操作 等功能。一、分頁組件 el-pagination用于控制大量數據的分頁展示。? 基本結構<el-paginationv-model:current-page"currentPa…

搭建機器學習模型的數據管道架構方案

本篇文章Designing Data Pipeline Architectures for Machine Learning Models適合對數據管道架構感興趣的讀者&#xff0c;亮點在于詳細解析了傳統數據倉庫、云原生數據湖和現代湖倉這三種架構&#xff0c;幫助理解如何將原始數據轉化為可操作的預測。文中還強調了不同架構的優…

GitHub 熱榜項目 - 日榜(2025-09-06)

GitHub 熱榜項目 - 日榜(2025-09-06) 生成于&#xff1a;2025-09-06 統計摘要 共發現熱門項目&#xff1a;15 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜顯示AI自動化與安全運維為核心趨勢。Bytebot、EvolutionAPI等AI代理項目凸顯自然語言交互和容器化…

Homebrew執行brew install出現錯誤(homebrew-bottles)

問題描述 在使用homebrew安裝軟件時&#xff0c;出現如下報錯&#xff1a; Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/bottles-portable-ruby/portable ruby-3.4.5.arm64_big_sur.bottle.tar.gz curl: (22) The requested URL returned error: 404 …

23種設計模式——工廠方法模式(Factory Method Pattern)詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a;Meteors.的博客 &#x1f49e;當前專欄&#xff1a;設計模式 ?特色專欄&#xff1a;知識分享 &#x…

NPU邊緣推理識物系統

目錄 NPU邊緣推理識物系統 一、項目簡介 二、硬件介紹 三、軟件設計 1、底層NPU推理代碼 2、應用層QT顯示代碼 四、項目成果展示 NPU邊緣推理識物系統 一、項目簡介 物品分類是計算機視覺的重要技術&#xff0c;本項目的核心是&#xff1a;使用NPU&#xff08;神經網絡…

C# WinForm分頁控件實現與使用詳解

C# WinForm分頁控件實現與使用詳解概述在WinForms應用程序開發中&#xff0c;數據分頁是常見的需求。本文將介紹如何實現一個功能完整的分頁控件&#xff0c;并在窗體中如何使用該控件進行數據分頁展示。分頁控件實現核心屬性與字段public partial class PageControl : UserCon…

高級 ACL 有多強?一個規則搞定 “IP + 端口 + 協議” 三重過濾

一、實驗拓撲及描述 二、實驗需求 1、完成拓撲中各設備的基礎配置&#xff0c;使得全網互通&#xff1b; 2、在上一個需求的基礎上&#xff0c;在路由器上部署高級ACL&#xff0c;使得Client1無法訪問Server的HTTP服務&#xff0c;但是PC1依然能夠訪問服務器及其他節點&#xf…

支持多材質密度設置的金屬重量計算使用指南

傳統手工計算各種型材&#xff08;如鋼管、角鋼、鋼板等&#xff09;的重量繁瑣且容易出錯。 它的體積小巧&#xff0c;不足100KB&#xff0c;運行不占內存&#xff0c;綠色免安裝&#xff0c;雙擊即開&#xff0c;使用便捷。 可計算鋼管、鋼板、型鋼、角鋼等常見型材的重量&a…