java 策略模式 demo

策略模式介紹

策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一系列算法,將每個算法封裝起來并使它們可相互替換。策略模式讓算法的變化獨立于使用算法的客戶端,從而實現靈活的算法切換。

核心角色:

  • ??環境類(Context):持有策略接口的引用,負責調用具體策略
  • ??策略接口(Strategy):定義所有支持的算法的公共接口
  • ??具體策略類(ConcreteStrategy):實現策略接口,提供具體算法實現

Java代碼實現示例

下面通過一個"支付方式選擇"的場景來演示策略模式:

//?策略接口:定義支付算法的公共接口
public?interface?PaymentStrategy?{void?pay(double?amount);
}//?具體策略類:PayPal支付
public?class?PayPalPayment?implements?PaymentStrategy?{private?String?emailId;private?String?password;public?PayPalPayment(String?emailId,?String?password)?{this.emailId?=?emailId;this.password?=?password;}@Overridepublic?void?pay(double?amount)?{System.out.println(amount?+?"?元用PayPal支付。");//?實際應用中會有驗證PayPal賬號、連接PayPal接口等邏輯}
}//?具體策略類:信用卡支付
public?class?CreditCardPayment?implements?PaymentStrategy?{private?String?name;private?String?cardNumber;private?String?cvv;private?String?expiryDate;public?CreditCardPayment(String?name,?String?cardNumber,?String?cvv,?String?expiryDate)?{this.name?=?name;this.cardNumber?=?cardNumber;this.cvv?=?cvv;this.expiryDate?=?expiryDate;}@Overridepublic?void?pay(double?amount)?{System.out.println(amount?+?"?元用信用卡支付。");//?實際應用中會有驗證信用卡信息、連接支付網關等邏輯}
}//?環境類:購物車,使用支付策略
public?class?ShoppingCart?{private?PaymentStrategy?paymentStrategy;//?設置支付策略public?void?setPaymentStrategy(PaymentStrategy?paymentStrategy)?{this.paymentStrategy?=?paymentStrategy;}//?結算public?void?checkout(double?amount)?{if?(paymentStrategy?==?null)?{throw?new?IllegalStateException("請先設置支付方式");}paymentStrategy.pay(amount);}
}//?客戶端代碼
public?class?Main?{public?static?void?main(String[]?args)?{ShoppingCart?cart?=?new?ShoppingCart();//?選擇信用卡支付PaymentStrategy?creditCardPayment?=?new?CreditCardPayment("張三",?"1234-5678-9012-3456",?"123",?"12/25");cart.setPaymentStrategy(creditCardPayment);cart.checkout(100.50);//?切換為PayPal支付PaymentStrategy?paypalPayment?=?new?PayPalPayment("zhangsan@example.com",?"password123");cart.setPaymentStrategy(paypalPayment);cart.checkout(200.75);}
}

代碼解釋

  1. 1.?策略接口(PaymentStrategy)
    • ? 定義了所有支付方式的統一接口pay(double amount)
    • ? 確保所有支付方式都遵循相同的調用規范
  2. 2.?具體策略類
    • ??CreditCardPayment:實現信用卡支付的具體邏輯
    • ??PayPalPayment:實現PayPal支付的具體邏輯
    • ? 每個策略類都封裝了自己的算法實現,相互獨立
  3. 3.?環境類(ShoppingCart)
    • ? 持有支付策略的引用,通過setPaymentStrategy方法設置具體策略
    • ? 提供checkout方法,內部調用當前策略的pay方法完成支付
    • ? 客戶端無需知道具體支付細節,只需與購物車交互
  4. 4.?客戶端(Main)
    • ? 創建具體的支付策略對象
    • ? 通過購物車設置支付策略并完成結算
    • ? 可以隨時切換不同的支付策略,無需修改購物車代碼

策略模式的優勢

  • ??靈活性高:可以在運行時動態切換算法
  • ??代碼復用:避免使用多重條件判斷(if-else或switch)
  • ??開閉原則:新增策略只需實現接口,無需修改現有代碼
  • ??責任單一:每個策略類專注于實現一種算法

適用場景:當一個系統需要多種算法,且需要動態選擇使用哪種算法時,適合使用策略模式。
更多參考資料

https://pan.baidu.com/s/1c1oQItiA7nZxz8Rnl3STpw?pwd=yftc
https://pan.quark.cn/s/dec9e4868381

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

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

相關文章

SAP Valuation Category在制造業成本核算中的使用場景與配置方案

Valuation Category在制造業成本核算中的使用場景與配置方案一、核心使用場景(制造業特有)1. 內制 vs 外購成本分離業務需求:同一物料可能通過內部生產(成本含料工費)或外部采購(成本含采購價運費&#xff…

我的 LeetCode 日記:Day 36 - 動態規劃,背包問題的千變萬化

昨天,我初步掌握了 0/1 背包問題的理論基礎和標準解法。今天,我將這種思想應用到了更廣泛的場景中。今天的幾道題,乍一看和背包沒什么關系,但通過巧妙的數學轉化,它們的核心都變成了 0/1 背包問題。 這讓我深刻體會到…

本地處理不上傳!隱私安全的PDF轉換解決方案

PDF能鎖定排版、字體、圖片位置,無論在什么設備打開都保持一致。它是無廣告、簡潔高效的專業PDF處理工具。功能豐富,支持批量操作:只需將文件拖入界面,選擇目標格式(如Word、PPT、Excel、圖片等)&#xff0…

Docker build創建鏡像命令入門教程

一、核心概念Dockerfile 定義鏡像構建步驟的文本文件,包含一系列指令和配置,用于自動化創建鏡像。鏡像層(Layer) Docker 鏡像由多層只讀層疊加而成,每個指令(如 RUN、COPY)會生成一個新的層。層…

Redis 是單線程模型嗎?

最近在面試中經常被問到這個問題:"Redis是單線程的嗎?"很多同學都會脫口而出:"是的!"但其實這個答案并不完全正確。今天我們就來聊聊Redis的線程模型,把這個問題徹底搞清楚。 先說結論 Redis的線程…

Hologres實戰:路徑分析函數

前言 Hologres提供了一套高效的路徑分析函數,包括路徑明細計算和結果解析功能,能夠幫助用戶深入理解用戶行為路徑,并通過桑基圖實現數據可視化。 一、核心功能 路徑明細計算:精確記錄用戶在產品或功能中的完整訪問路徑結果解析…

產品開發實踐(常見的軟硬結合方式)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】前面說過,傳統的純軟件開發,在國內的大背景下面是很難存活的。但是如果是把軟件,構建在硬件基礎之上&#xff0c…

Linux | i.MX6ULL網絡通信-套字節 UDP(第十八章)

01 Linux | i.MX6ULL網絡通信-套字節 TCP(第十七章) 02 iTOP-IMX6ULL 實現基于 UDP 的 socket 編程。

學習嵌入式第三十天

文章目錄進程和線程&#xff08;續&#xff09;線程1.線程傳參2.線程屬性3.線程間通信1.概念2.方式3.互斥鎖4.死鎖5.信號量習題 進程和線程&#xff08;續&#xff09; 線程 1.線程傳參使用第四個參數實現對線程內部的傳參 代碼實現&#xff1a; #include <stdio.h> #inc…

GaussDB 數據庫架構師修煉(十三)安全管理(3)-行級訪問控制

1 背景行級訪問控制特性將數據庫的訪問控制精確到數據表行級別 &#xff0c;只允許用戶查看 、更新或刪除特定的行數據。2 實例場景實例以醫生只能看到治療的病人&#xff0c;不能看其它醫生的病人為例&#xff1a;1)醫院病人的信息表pat_info&#xff1a;csdn> set search_…

Wi-Fi 與蜂窩網絡(手機網絡)的核心區別,以及 Wi-Fi 技術未來的發展方向

在日常生活中&#xff0c;我們既離不開家里的 Wi-Fi&#xff0c;也離不開手機的 4G/5G 網絡。它們都能把我們連接到互聯網&#xff0c;但底層的工作方式卻大不相同。一、設計初衷的不同Wi-Fi誕生于 1997 年的 IEEE 802.11 標準&#xff0c;定位是局域網無線替代。它的目標是讓電…

C++編程實戰:高效解決算法與數據結構問題

個人主頁 &#xff1a; zxctscl 專欄 【C】、 【C語言】、 【Linux】、 【數據結構】、 【算法】 如有轉載請先通知 題目1. 數字統計2. 兩個數組的交集3. 牛牛的快遞4. 點擊消除5. 最小花費爬樓梯6. 簡寫單詞1. 數字統計 BC153 數字統計 #include <iostream> using na…

《零基礎入門AI:深度學習中的視覺處理(卷積神經網絡(CNN)進階)》

一、卷積知識擴展 1. 二維卷積 單通道版本 對于單通道輸入圖像 III (尺寸 HWH \times WHW) 和卷積核 KKK (尺寸 FFF \times FFF)&#xff0c;輸出特征圖 OOO 的計算公式為&#xff1a; O(i,j)∑m0F?1∑n0F?1I(im,jn)?K(m,n)O(i,j) \sum_{m0}^{F-1} \sum_{n0}^{F-1} I(im, j…

pyecharts可視化圖表-pie:從入門到精通(進階篇)

歡迎來到pyecharts餅圖系列教程的進階篇&#xff01;在上一篇基礎教程中&#xff0c;我們學習了餅圖的基本概念和簡單實現。在本文中&#xff0c;我們將深入探索pyecharts中餅圖的六種高級用法和自定義選項&#xff0c;包括環形餅圖、富文本標簽餅圖、滾動圖例餅圖、環形圖、嵌…

【JAVA 核心編程】面向對象高級:類變量與方法 抽象類與接口

一、類變量與類方法&#xff08;靜態變量&#xff09; 1&#xff09;類變量 class Child{private String name;//定義一個變量count&#xff0c;是一個類變量&#xff08;靜態變量&#xff09;static靜態//該變量最大的特點就是會被Child 類的所有對象訪問public static int co…

【Java基礎面試題】數據類型

Java面試高頻總結&#xff1a;基本數據類型深度解析 &#x1f4ca; 八種基本數據類型詳解數據類型關鍵字字節數位數默認值取值范圍核心特性字節型byte180-128 ~ 127最小整數類型短整型short2160-32,768 ~ 32,767較少使用整型int4320-2 ~ 2-1 (約21億)最常用整數類型長整型long8…

攻防世界—unseping(反序列化)

一.審題<?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_u…

AI熱點周報(8.10~8.16):AI界“冰火兩重天“,GPT-5陷入熱議,DeepSeek R2模型訓練受阻?

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄3分鐘速覽版&#xff1a;一張表看懂本周AI大事一、GPT-5&#xff1a;期待越高&#x…

Python_vue3_django旅拍在線婚紗攝影網站的設計與實現016023190_源碼LW_講解安裝

目錄前言-本系統介紹已開發項目效果實現截圖開發技術詳細介紹論文設計框架系統測試核心代碼參考示例總結源碼獲取詳細視頻演示或者查看其他版本&#xff1a;文章底部獲取博主聯系方式&#xff01;前言-本系統介紹 利用Python語言、MySQL數據庫&#xff0c;Django框架&#xff0…

Python爬蟲-爬取政務網站的文檔正文內容和附件數據

前言 本文是該專欄的第67篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文,筆者以某政務網站為例子。基于Python爬蟲采集某政務網站的文檔正文內容和其關聯的附件數據。 具體的實現思路以及完整實現代碼邏輯,筆者將在正文進行詳細介紹。廢話不多說,跟著筆者直接往下…