23種設計模式——策略模式 (Strategy Pattern)?詳解

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。
🍎個人主頁:Meteors.的博客
💞當前專欄:設計模式
?特色專欄:知識分享
🥭本文內容:23種設計模式——策略模式 (Strategy Pattern)?詳解
📚 ** ps **? :閱讀文章如果有問題或者疑惑,歡迎在評論區提問或指出。


目錄

一. 背景

二. 簡介

三. 核心思想

四. 主要角色

五. 簡單demo(Java)

六. 策略模式的優點

七. 策略模式的缺點

八. 總結


一. 背景

我原本也不知道策略模式是什么......知道有一天,發現手上需求的底層用的就是策略模式,于是才恍然大悟。于是結合網上的一些資料,完成了這篇博客。


二. 簡介

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

大白話講,就是定義了幾個表示不同類型的類,讓它們可以作為參數傳入管理類的同一個方法中——至于為什么都滿足管理類的方法參數條件,因為這些類型類都實現了一個相同的基類.......


三. 核心思想

  • 定義一組算法??:把它們封裝成獨立的類(即策略類),這些類實現相同的接口或繼承相同的抽象類。
  • 運行時動態選擇算法??:客戶端在使用時根據需要選擇具體的策略,而不需要修改使用算法的代碼。
  • 遵循開閉原則(OCP)??:對擴展開放,對修改關閉。新增策略時無需修改已有代碼。

四. 主要角色

  1. Context(上下文)??
    持有一個策略對象的引用,負責與客戶端交互,并調用策略對象的方法來執行具體行為。
  2. Strategy(策略接口)??
    定義所有支持的算法或行為的公共接口。
  3. ConcreteStrategy(具體策略類)??
    實現 Strategy 接口,提供具體的算法實現。

五. 簡單demo(Java)

下面代碼模擬了一個電商系統,針對不同用戶類型(如普通用戶、VIP用戶)有實現不同的折扣策略。

// Strategy: 折扣策略接口
public interface DiscountStrategy {double applyDiscount(double originalPrice);
}
// ConcreteStrategy: 普通用戶無折扣
public class NoDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice;}
}// ConcreteStrategy: VIP用戶打8折
public class VipDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice * 0.8;}
}
// Context: 負責使用策略
public class PricingContext {private DiscountStrategy discountStrategy;// 設置策略public void setDiscountStrategy(DiscountStrategy strategy) {this.discountStrategy = strategy;}// 執行折扣計算public double calculatePrice(double originalPrice) {if (discountStrategy == null) {throw new IllegalStateException("未設置折扣策略");}return discountStrategy.applyDiscount(originalPrice);}
}
public class Client {public static void main(String[] args) {PricingContext context = new PricingContext();double price = 100.0;// 普通用戶,無折扣context.setDiscountStrategy(new NoDiscountStrategy());System.out.println("普通用戶價格: " + context.calculatePrice(price)); // 輸出 100.0// VIP用戶,打8折context.setDiscountStrategy(new VipDiscountStrategy());System.out.println("VIP用戶價格: " + context.calculatePrice(price)); // 輸出 80.0}
}

通過上面的這些代碼,通過簡單的改變參數,就實現了對價格計算的快速替換,減少了if/else的判斷邏輯,讓代碼更加簡潔,并且容易擴展。


六. 策略模式的優點

  • ??開閉原則??:新增策略不影響現有代碼。
  • 消除條件語句??:避免大量的 if-else 或 switch-case。
  • 提高可維護性與可擴展性??:策略實現獨立,易于理解和替換。
  • 算法復用??:策略可以在不同的上下文中復用。

七. 策略模式的缺點

  • 客戶端必須了解不同策略??:客戶端需要知道有哪些策略并選擇合適的策略。
  • 類數量增多??:每一種策略都是一個類,可能會增加類的數量。
  • 策略對象之間的通信較復雜時處理不便??:如果策略之間有依賴關系,可能需要額外設計。

八. 總結

策略模式是一種行為型模式。通過定義一系列封裝并可互換算法,以達到避免大量條件判斷,實現算法的靈活切換和擴展的目的。


最后,

? ? ? ? 其它設計模式會陸續更新,希望文章對你有所幫助!

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

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

相關文章

CI(持續集成)、CD(持續交付/部署)、CT(持續測試)、CICD、CICT

目錄 **CI、CD、CT 詳解與關系** **1. CI(Continuous Integration,持續集成)** **2. CD(Continuous Delivery/Deployment,持續交付/部署)** **持續交付(Continuous Delivery)** **持續部署(Continuous Deployment)** **3. CT(Continuous Testing,持續測試)** **4.…

【音視頻】WebRTC ICE 模塊深度剖析

原文鏈接: https://mp.weixin.qq.com/s?__bizMzIzMjY3MjYyOA&mid2247498075&idx2&sn6021a2f60b1e7c71ce4d7af6df0b9b89&chksme893e540dfe46c56323322e780d41aec1f851925cfce8b76b3f4d5cfddaa9c7cbb03a7ae4c25&scene178&cur_album_id314699…

linux0.12 head.s代碼解析

重新設置IDT和GDT,為256個中斷門設置默認的中斷處理函數檢查A20地址線是否啟用設置數學協處理器將main函數相關的參數壓棧設置分頁機制,將頁表映射到0~16MB的物理內存上返回main函數執行 源碼詳細注釋如下: /** linux/boot/head.s** (C) 1991 Linus T…

Maven動態控制版本號秘籍:高效發包部署,版本管理不再頭疼!

作者:唐叔在學習 專欄:唐叔的Java實踐 關鍵詞:Maven版本控制、versions插件、動態版本號、持續集成、自動化部署、Java項目管理 摘要:本文介紹如何使用Maven Versions插件動態控制項目版本號和依賴組件版本號,實現無需…

簡述:普瑞時空數據建庫軟件(國土變更建庫)之一(變更預檢查部分規則)

簡述:普瑞時空數據建庫軟件(國土變更建庫)之一(變更預檢查部分規則) 主要包括三種類型:常規檢查、行政區范圍檢查、20X異常滅失檢查 本blog地址:https://blog.csdn.net/hsg77

shell中命令小工具:cut、sort、uniq,tr的使用方式

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄前言一、cut —— 按列或字符截取1. 常用選項2. 示例二、sort —— 排序(默認按行首字符升序)1. 常用選項常用 sort 命令選項三、uniq —— 去…

【Linux】Linux開發必備:Git版本控制與GDB調試全指南

前言:在Linux開發流程中,版本控制與程序調試是保障項目穩定性和開發效率的兩大核心環節。Git作為當前最主流的分布式版本控制系統,能高效管理代碼迭代、追蹤修改記錄并支持多人協同開發;GDB(GNU調試器)是Li…

實現 TypeScript 內置工具類型(源碼解析與實現)

目標讀者:已經熟悉 TypeScript 基礎語法、泛型、條件類型的同學。本文按常見工具類型的分類與順序實現并解釋 Partial、Required、Readonly、Pick、Omit、Record、Exclude、Extract、NonNullable、ReturnType、Parameters、ConstructorParameters、InstanceType、Th…

Spring Boot + Nacos 配置中心示例工程

1?? 工程結構 nacos-demo├── pom.xml└── src├── main│ ├── java│ │ └── com.example.nacosdemo│ │ ├── NacosDemoApplication.java│ │ ├── config│ │ │ └── AppProperties.java│ │ └── cont…

(二)文件管理-基礎命令-pwd命令的使用

文章目錄1. 命令格式2. 基本用法3. 高級用法4. 注意事項1. 命令格式 pwd [OPTION]...[OPTION]: 可選選項,用于改變命令的默認行為。最主要的兩個選項是 -L 和 -P。它不需要任何參數(如文件名或目錄名) 2. 基本用法 用法:pwd 是…

Leetcode_202.快樂數_三種方法解決(普通方法解決,哈希表解決,循環鏈表的性質解決_快慢指針)

目錄第一種方法:暴力解法暴力ac代碼:第二種方法:哈希表哈希表ac代碼:第三種方法:根據循環鏈表的性質(快慢指針)第一種方法:暴力解法 最暴力的思路就是直接使用循環往下一直計算,這樣特別浪費時間&#xff…

代碼隨想錄刷題Day48

這次博客主要是對做過的關于二叉樹系列的題目進行整理和分類。二叉樹,要處理整個樹,一般少不了遍歷。遍歷主要可以分為:遞歸系列、層序遍歷。如果不遍歷的話,那就是處理特殊的樹了,比如完全二叉樹。遞歸系列基本的遞歸…

汽車工裝結構件3D掃描尺寸測量公差比對-中科米堆CASAIM

汽車制造過程中,工裝結構件的尺寸精度對整車裝配質量和生產進度有重要影響。傳統測量工具如卡尺和三坐標測量機采用接觸式工作方式,檢測過程耗時較長,對于具有復雜曲面特征的工件,難以全面獲取尺寸數據。激光三維掃描技術改變了傳…

Docker Pull 代理配置方法

本文介紹通過網絡代理加速Docker鏡像拉取的方法。 配置方法 當執行docker pull從Docker Hub 拉取鏡像時,其網絡連接由守護進程docker daemon進行維護。 要修改其代理設置,可配置其systemd服務,步驟如下: (1&#xf…

機電裝置:從基礎原理到前沿應用的全方位解析

本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術! 1 機電裝置的基本概念與發展歷程 機電裝置(Mechatronic D…

《SVA斷言系統學習之路》【03】關于布爾表達式

序列中使用的表達式基于其所含變量的采樣值進行評估。表達式評估的結果為布爾值,其解釋方式與過程性if語句條件中的表達式完全相同:若表達式計算結果為X、Z 或 0,則被解釋為假;否則即為真。但是,對可出現在并發斷言中的…

指針高級(2)

6.數組指針#include <stdio.h> int main() {/*練習&#xff1a;利用指針遍歷數組*///1.定義數組int arr[] { 10,20,30,40,50 };int len sizeof(arr) / sizeof(int);//2.獲取數組的指針//實際上獲取的&#xff1a;數組的首地址int* p1 arr;int* p2 &arr[0];printf…

如何高效記單詞之:抓住首字母——以find、fund、fond、font為例

find、fund、fond、font這幾個單詞&#xff0c;你都認識嗎&#xff1f;這幾個單詞&#xff0c;意思大體如下&#xff1a; find v.找到&#xff1b;發現fund n.基金fond a.喜歡的&#xff1b;喜愛的&#xff1b;深情的font n.字體&#xff0c;字型&#xff0c;字形 這幾個單詞在…

Ubuntu下把 SD 卡格式化為 FAT32

在 Ubuntu 下把 SD 卡格式化為 FAT32&#xff0c;按下面做&#xff08;會抹掉整卡數據??&#xff09;&#xff1a; 1) 找到你的 SD 卡設備名 lsblk -p記下整盤設備&#xff0c;比如 /dev/sdb&#xff08;USB 讀卡器常見&#xff09;或 /dev/mmcblk0&#xff08;內置讀卡器&am…

涉私數據安全與可控匿名化利用機制研究(上)

文章目錄前言一、涉私數據的概述及分類&#xff08;一&#xff09;涉私數據的“知情同意原則”&#xff08;二&#xff09;涉私數據的分類二、涉私數據可控匿名化利用機制&#xff08;一&#xff09;數據產品與涉私數據的利用形式&#xff08;二&#xff09;通過可信數據空間受…