23種策略模式之策略模式

文章目錄

    • 前言
    • 優缺點
    • 使用場景
    • 角色定義
    • UML
    • 模擬示例
    • 小結

前言

在軟件開發中,設計模式是為了解決常見問題而提供的一套可重用的解決方案。策略模式(Strategy Pattern)是其中一種常見的設計模式,它屬于行為型模式。該模式的核心思想是將不同的算法封裝成獨立的策略類,使得它們可以相互替換,而不影響客戶端的使用。

策略模式與其他設計模式有一些明顯的區別。與模板方法模式相比,策略模式強調算法的靈活性,允許在運行時切換不同的策略。與狀態模式相比,策略模式更注重不同算法之間的替換性,而非狀態的內部轉換。

優缺點

優點
策略類之間相互獨立,易于擴展和維護。

可以在運行時動態切換策略,靈活性高。

提供了一種可替代繼承的方案,避免繼承層次的臃腫。

缺點
客戶端需要了解不同的策略類,增加了使用的復雜度。

策略模式增加了類的數量,可能會導致系統更加龐大。

使用場景

如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為
一個系統需要動態地在幾種算法中選擇一種
如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現
如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題

角色定義

  • 策略Context(上下文)

策略模式定義上下文角色本意是為了通過不同策略對象讓上下文調用對應的算法或行為。

  • 策略抽象

策略抽象主要設定行為,定義策略需要具有哪些行為。

  • 策略實現

具體策略的實現,實現策略抽象行為具體細節。

UML

在這里插入圖片描述

  • FruitMarket(策略抽象)
  • PapayaPeddler、KiwifruitPeddler、WatermelonPeddler(策略算法實現)
  • SellFruitsContext(策略Context)

模擬示例

//賣水果策略 上下文
public class SellFruitsContext{//水果市場策略抽象private FruitMarket fruitMarket;public SellFruitsContext() {}public SellFruitsContext(FruitMarket fruitMarket) {this.fruitMarket = fruitMarket;}//調用策略方法public void sellFruit(){this.fruitMarket.sellFruits();}
}
//水果市場 策略抽象
public interface FruitMarket {void sellFruits();
}
//策略實現者
public class KiwifruitPeddler implements FruitMarket {public void sellFruits() {System.out.println("賣獼猴桃咯,保熟!!");}
}public class PapayaPeddler  implements FruitMarket {public void sellFruits() {System.out.println("賣木瓜咯,瓜保熟!!");}
}public class WatermelonPeddler implements FruitMarket {public void sellFruits() {System.out.println("賣西瓜咯,瓜保熟!!");}
}
//定義類型枚舉 通過 類型獲取 對應的策略算法
public enum FruitEnum {KIWIFRUIT(1,KiwifruitPeddler.class),PAPAYA(2,PapayaPeddler.class),WATERMELON(3,WatermelonPeddler.class);//水果類型private Integer fruitType;//水果類型對應的策略算法private Class c;FruitEnum() {}FruitEnum(Integer fruitType, Class c) {this.fruitType = fruitType;this.c = c;}public FruitEnum getFruitEnumByType(Integer fruitType){for (FruitEnum value : FruitEnum.values()) {if(value.fruitType==fruitType)return value;}return null;}
}

小結

通過類型在枚舉類獲取對應策略算法實現類,將策略算法實現類傳入策略上下文,通過策略上下文調用具體的策略算法。后期業務擴展可新增枚舉數據添加策略算法實現類,完成對擴展業務的實現。

策略模式在代碼重構的時候是很常見的,減少大量if else代碼、增強代碼擴展性、策略算法的靈活切換、避免單個條件重復判斷,很多情況選擇switch以及if else會比較多,但是隨著業務復雜度業務代碼量上來了,隨之代碼的擴展性以及可讀性降低代碼也顯得極其臃腫,雖說對于每一種算法都要為其建立一種策略類,相對比較懶的程序員更愿意寫if else,有時候也不要覺得策略算法實現類太多,因為策略算法的多少取決于你的業務復雜度,正是因為策略算法很多才體現出業務的復雜,才更需要用好策略模式。

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

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

相關文章

Java程序設計實驗6 | 集合類

*本文是博主對Java各種實驗的再整理與詳解,除了代碼部分和解析部分,一些題目還增加了拓展部分(?)。拓展部分不是實驗報告中原有的內容,而是博主本人自己的補充,以方便大家額外學習、參考。 (解…

基于ssm的大型商場會員管理系統論文

摘 要 進入信息時代以來,很多數據都需要配套軟件協助處理,這樣可以解決傳統方式帶來的管理困擾。比如耗時長,成本高,維護數據困難,數據易丟失等缺點。本次使用數據庫工具MySQL和編程框架SSM開發的大型商場會員管理系統…

【漏洞復現】FLIR AX8紅外線熱成像儀命令執行漏洞

漏洞描述 eledyne FLIR 設計、開發、制造以及強大的傳感和意識技術。自透射熱圖像、可見光圖像、可見頻率分析、來自測量和診斷的先進威脅測量系統以及日常生活的創新解決方案。 Teledyne FLIR 提供多種產品用于政府、國防、工業和商業市場。我們的產品,緊急救援人員,軍事人…

插入排序與希爾排序(C語言實現)

1.插入排序 由上面的動圖可以知道插入排序的邏輯就是從第一個元素開始往后遍歷,如果找到比前一個元素小的(或者大的)就往前排,所以插入排序的每一次遍歷都會保證前面的數據是有序的,接下類用代碼進行講解。 我們這里傳…

bash中通過變量中的內容獲取對應的關聯數組

bash中通過變量中的內容獲取對應的關聯數組 Bash declare 手冊: https://phoenixnap.com/kb/bash-declare 實際問題: 在 bash 中創建了多個關聯數組,需要根據輸入的值,獲取不同的關聯數組。 可以使用 if 進行多次判斷&#xff…

智能優化算法應用:基于浣熊算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用:基于浣熊算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用:基于浣熊算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.浣熊算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

解決HTTP錯誤500.19 - internal server error -內部服務器錯誤的終極指南

在開發和維護網絡應用程序時,難免會遇到各種HTTP錯誤代碼。其中,HTTP錯誤500.19 - 內部服務器錯誤可謂是最令人頭痛的問題之一。當你的應用程序遇到這個錯誤時,它似乎就像一道墻壁,擋住了你前進的道路。但別擔心,本篇技…

Git全局設置命令---設置提交人姓名

介紹 使用git命令設置提交人姓名 命令 git config --global user.name "超音速"

react-photo-view 的介紹、安裝、使用。

目錄 基本介紹 安裝 使用 基本介紹 react-photo-view 是一個基于 React 的圖片查看器組件,用于在網頁上展示和瀏覽圖片。該組件提供了用戶友好的界面和交互,可以輕松地在應用程序中集成并使用。 支持觸摸手勢,拖動/平移/物理效果滑動…

修改移遠提供的GobiNet、quectel-CM源碼,使其支持有方N720 4G模塊

最近在研究imx6ull linux下4G模塊驅動的移植,參考的移遠ec20的移植方法,添加了GobiNet驅動,編譯了quectel-CM工具,并且可以正常撥號,分配到ip,如下: ping外網也沒有壓力,如下…

軟件工程 考試重點

結構化分析 考慮數據和處理的需求分析方法,稱為結構分析方法(SA) 結構化分析基于 分解、抽象 的基本思想 分解:對于復雜的系統,為將復雜度降低到可以掌握的程度,可以把大問題分解為若干個小問題&#xf…

【go-zero】go-zero使用ent框架 如何使用源生sql完成查詢

背景 本篇教程我們采用的是go-zero的快速腳手架工具 simple-admin 框架的開發 github地址:https://github.com/suyuan32/simple-admin-core 因為框架推薦使用Ent 這篇教程我們則對Ent的基本使用的幾種形式進行一個總結 一、開啟ent的源生sql 1、simple-admin生成rpc 【go-…

QT 中 線程池 (備查)

QRunnable類 API 1)在Qt中使用線程池需要先創建任務,添加到線程池中的每一個任務都需要是一個 QRunnable 類型,因此在程序中需要創建子類繼承 QRunnable 這個類。 2)然后重寫 run() 方法,在這個函數中編寫要在線程池中…

RabbitMQ使用指南

介紹主要特點常用插件使用RabbitMQ的插件常用插件列表 應用場景Kafka與RabbitMq的區別主要優缺點安裝步驟插件安裝步驟 使用RabbitMqJava代碼示例拓展 介紹 RabbitMQ是由Erlang語言開發的,基于AMQP(高級消息隊列協議)協議實現的開源消息代理…

元宇宙紅色展廳VR虛擬展館提高受訓者的參與感

生活在和平年代的新一代青少年,可能對革命先烈英勇事跡難以有很深的體會,無法切實感受到中國共產黨無畏犧牲、誓死保家衛國的紅色精神,因此借助VR虛擬現實制作技術,讓參觀者們走近革命先烈中,感受老一輩無產階級革命家…

搜索引擎和網絡瀏覽器之間的區別

術語“搜索引擎”和“網絡瀏覽器”與互聯網有關。搜索引擎基本上是用于通過 Internet 搜索信息的工具,而 Web 瀏覽器是用于加載網頁等 HTML 文件的應用軟件。 閱讀本文以了解有關搜索引擎和網絡瀏覽器以及它們之間的區別的更多信息。 什么是搜索引擎? …

TrustZone之SMC異常

作為支持兩個安全狀態的一部分,該架構包括了Secure Monitor Call(SMC)指令。執行SMC會引發Secure Monitor Call異常,該異常目標是EL3。 通常,SMC用于請求服務,可以是來自駐留在EL3中的固件,也可…

微信小程序適配方案:rpx(responsive pixel響應式像素單位)

小程序適配單位:rpx 規定任何屏幕下寬度為750rpx 小程序會根據屏幕的寬度自動計算rpx值的大小 Iphone6下:1rpx 1物理像素 0.5css 小程序編譯后,rpx會做一次px換算,換算是以375個物理像素為基準,也就是在一個寬度…

迭代器失效及解決辦法

當使用迭代器遍歷容器并刪除元素時&#xff0c;迭代器可能會失效。 對于vector來說&#xff0c;如果使用普通迭代器&#xff08;例如std::vector<int>::iterator&#xff09;進行遍歷和刪除操作&#xff0c;當你刪除一個元素后&#xff0c;后面的元素會向前移動填補空缺…

服務器如何保證數據安全_Maizyun

服務器如何保證數據安全 在當今的數字化時代&#xff0c;數據安全已經成為企業和社會組織必須面對的重要問題。服務器作為存儲和處理大量數據的核心組件&#xff0c;必須采取有效的措施來確保數據的安全。本文將探討服務器如何保證數據安全。 一、訪問控制和身份認證 訪問控…