23種設計模式-行為型模式之策略模式(Java版本)

Java 策略模式(Strategy Pattern)詳解

🧠 什么是策略模式?

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


🎯 使用場景

  • 多種算法或行為頻繁切換
  • 避免冗長的 if-elseswitch 語句
  • 希望將行為的選擇交由客戶端決定

🏗? 模式結構

  • Context(上下文):維護一個對策略對象的引用
  • Strategy(抽象策略類):定義所有支持的算法的公共接口
  • ConcreteStrategy(具體策略類):實現具體的算法

? 示例:支付策略

策略接口(Strategy)

public interface PaymentStrategy {void pay(int amount);
}

具體策略(ConcreteStrategy)

public class CreditCardPayment implements PaymentStrategy {private String cardNumber;public CreditCardPayment(String cardNumber) {this.cardNumber = cardNumber;}@Overridepublic void pay(int amount) {System.out.println("使用信用卡支付 " + amount + " 元,卡號:" + cardNumber);}
}public class WeChatPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("使用微信支付 " + amount + " 元");}
}

上下文類(Context)

public class PaymentContext {private PaymentStrategy strategy;public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public void executePayment(int amount) {strategy.pay(amount);}
}

客戶端調用

public class Client {public static void main(String[] args) {PaymentContext context = new PaymentContext();context.setStrategy(new CreditCardPayment("1234-5678-9876"));context.executePayment(500);context.setStrategy(new WeChatPayment());context.executePayment(300);}
}

? 優點

  • 避免大量條件語句
  • 易于擴展新策略,符合開閉原則
  • 提高算法或行為的靈活性

?? 缺點

  • 增加了類的數量
  • 客戶端必須了解所有策略,才能選擇合適的

🧩 使用建議

當你有多種行為變化的情況,并希望通過多態將它們分開處理時,策略模式是一個很優雅的選擇。

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

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

相關文章

使用 AI Agent 改善師生互動的設計文檔

使用 AI Agent 改善師生互動的設計文檔 一、引言 1.1 研究背景 當前教育領域的師生互動存在諸多挑戰,如教師負擔過重、學生個體差異大導致難以滿足所有人的需求,以及信息傳遞延遲等問題。引入AI-Agent能夠有效緩解這些問題,通過自動化手段協…

2、Ubuntu 環境下安裝RabbitMQ

?. 安裝Erlang RabbitMqRabbitMq需要Erlang語?的?持,在安裝rabbitMq之前需要安裝erlang需要Erlang語?的?持,在安裝rabitMq之前需要安裝erlang。 安裝erlang # 更新軟件包 sudo apt-get update # 安裝 erlang sudo apt-get install erlang 查看er…

Node.js 操作 ElasticSearch 完整指南:從安裝到實戰

本文將手把手教你如何搭建 ElasticSearch 環境,并通過 Node.js 實現高效數據檢索。包含 10 個可直接復用的代碼片段,助你快速掌握搜索、聚合等核心功能! 環境搭建篇 1. ElasticSearch 安裝要點 下載 es下載連接 下載下來后,進…

硬核科普丨2025年安全、高效網絡準入控制系統深度解析

陽途網絡準入控制系統(Network Access Control,簡稱NAC)是當代網絡安全領域的重要工具,有效防止未經授權的訪問和數據泄露,保障網絡資源的安全性和完整性。本文將深入探討陽途網絡準入控制系統的的重要性和作用。 一、…

搜索二叉樹-key的搜索模型

二叉搜索樹(Binary Search Tree, BST)是一種重要的數據結構,它有兩種基本模型:Key模型和Key/Value模型。 一、Key模型 1.基本概念 Key模型是二叉搜索樹中最簡單的形式,每個節點只存儲一個鍵值(key),沒有額外的數據值(value)。這…

安卓四大組件之ContentProvider

目錄 實現步驟 代碼分析 onCreate insert query ContextHolder Cursor 作用與用法 基本步驟: 可能的面試題:為什么使用Cursor? 為什么使用Cursor 使用Cursor的好處 靜態內部類實現單例模式 AnndroidManifest.xml配置信息 注釋的…

【HTML】【Web開發】滑動條挑戰

最近在思考如何開發一些入門級的迷你游戲,于是抽空寫了個HTML的滑動條小游戲。 游戲規則如下: 在[0, 100]區間內隨機生成一個目標值,顯示為:X% 倒計時 3 秒過后,出現 10 秒的挑戰倒計時和【停止】按鈕 挑戰倒計時結…

面試踩過的坑

1、 “”和equals 的區別 “”是運算符,如果是基本數據類型,則比較存儲的值;如果是引用數據類型,則比較所指向對象的地址值。equals是Object的方法,比較的是所指向的對象的地址值,一般情況下,重…

專業軟件開發全流程實踐指南

作為一家擁有十余年行業積淀的專業軟件開發服務提供商,我們見證了太多項目從無到有的全過程。今天,我們就用最樸實的語言,跟大家聊聊一個軟件產品從構思到上線的完整歷程。這些經驗不僅適用于自建技術團隊的企業,對正在尋找軟件外…

聊透多線程編程-線程互斥與同步-12. C# Monitor類實現線程互斥

目錄 一、什么是臨界區? 二、Monitor類的用途 三、Monitor的基本用法 四、Monitor的工作原理 五、使用示例1-保護共享變量 解釋: 六、使用示例2-線程間信號傳遞 解釋: 七、注意事項 八、總結 在多線程編程中,線程之間的…

第R4周:LSTM-火災溫度預測

文章目錄 一、前期準備工作1.導入數據2. 數據集可視化 二、構建數據集1. 數據集預處理2. 設置X, y3. 劃分數據集 三、模型訓練1. 構建模型2. 定義訓練函數3. 定義測試函數4. 正式訓練模型 四、模型評估1. Loss圖片2. 調用模型進行預測3. R2值評估 總結: &#x1f36…

toCharArray作用

toCharArray() 是 Java 中 String 類的一個方法,其作用是將字符串對象轉換為一個字符數組。下面為你詳細介紹其用法、原理和示例。 方法定義 toCharArray() 方法在 java.lang.String 類里被定義,方法簽名如下 public char[] toCharArray() 此方法沒有…

STM32八股【6】-----CortexM3的雙堆棧(MSP、PSP)設計

STM32的線程模式(Thread Mode)和內核模式(Handler Mode)以及其對應的權級和堆棧指針 線程模式: 正常代碼執行時的模式(如 main 函數、FreeRTOS任務) 可以是特權級(使用MSP&#xff…

驅動支持的最高CUDA版本與實際安裝的Runtime版本

查看電腦上安裝的CUDA版本的多種方法,適用于不同系統和場景。 方法一:通過命令行工具 1. 查看CUDA Driver API版本(顯卡驅動支持的CUDA版本) 命令:nvidia-smi操作: 打開終端(Windows為CMD/Pow…

Python CT圖像預處理——基于ITK-SNAP

Python CT圖像預處理——nii格式讀取、重采樣、窗寬窗位設置_python讀取nii-CSDN博客 基于原文指出以下幾個問題:文件路徑設置模糊;nilabel里面使用的get_data() 方法已經過時;需要導入scikit-image,還要導入一個matplotlib。 一…

【MQ篇】RabbitMQ之消息持久化!

目錄 一、 交換機持久化 (Exchange Persistence)二、 隊列持久化 (Queue Persistence)三、 消息持久化 (Message Persistence)四、 持久化的“黃金三角” 🔱:三者缺一不可!五、 來,完整的代碼示例(整合持久化和確認機制…

[AI技術(二)]JSONRPC協議MCPRAGAgent

Agent概述(一) AI技術基礎(一) JSON-RPC 2.0 協議詳解 JSON-RPC 2.0 是一種基于 JSON 的輕量級遠程過程調用(RPC)協議,旨在簡化跨語言、跨平臺的遠程通信。以下從協議特性、核心結構、錯誤處理、批量請求等角度進行詳細解析: 一、協議概述 1. 設計原則 ? 簡單性:…

LeetCode238_除自身以外數組的乘積

LeetCode238_除自身以外數組的乘積 標簽:#數組 #前綴和Ⅰ. 題目Ⅱ. 示例0. 個人方法一:暴力循環嵌套0. 個人方法二:前綴和后綴分別求積 標簽:#數組 #前綴和 Ⅰ. 題目 給你一個整數數組 nums,返回 數組 answer &#…

算法筆記.spfa算法(bellman-ford算法的改進)

題目:(來源于AcWing) 給定一個 n 個點 m 條邊的有向圖,圖中可能存在重邊和自環, 邊權可能為負數。 請你求出 1 號點到 n 號點的最短距離,如果無法從 1 號點走到 n 號點,則輸出 impossible。 …

07 Python 字符串全解析

文章目錄 一. 字符串的定義二. 字符串的基本用法1. 訪問字符串中的字符2. 字符串切片3. 字符串拼接4. 字符串重復5.字符串比較6.字符串成員運算 三. 字符串的常用方法1. len() 函數2. upper() 和 lower() 方法3. strip() 方法4. replace() 方法5. split() 方法 四. 字符串的進階…