設計模式--策略模式

目錄

一.場景

1.1場景

2.2 何時使用

?2.3個人理解

二. 業務場景練習

?2.1業務:

2.2具體實現

2.3思路?

?三.總結

3.1策略模式的特點:

?3.2策略模式優點

3.3策略模式缺點


一.場景

1.1場景

  1. 許多相關的類僅僅是行為有異,也就是說業務代碼需要根據場景不同,切換不同的實現邏輯
  2. 一個類定義了多種行為,并且這些行為在類的操作中以多個條件語句的形式出現,也就是說代碼中存在大量 if else 邏輯判斷

2.2 何時使用

? ?當一件任務可以使用不同的方式來完成,就可以使用策略模式?

?2.3個人理解

? 策略模式簡單理解,應該是對于同一個業務功能,在不同的場景需求下提供不同的實現邏輯,來達到動態切換業務算法,滿足不同場景的目的。同時它也有另外的好處,即優化代碼結構,使其脫離大量邏輯判斷,對外只提供 Context上下文,讓算法與實際業務代碼解耦,對使用者屏蔽底層實現邏輯。

? 對于我們根據不同的場景, 會定義應對不同場景相應的方法, 然而這些方法就是我們的策略,?

策略模式 UML類圖如下:

?每個策略通過不同業務條件, 找到相應的算法類或邏輯類 , 最終得到想要的結果?

二. 業務場景練習

?2.1業務:

? ? ?我們出行會根據不同的交通方式,制定不同的出行方式,比如:自駕、大巴車、高鐵、飛機,而每出行方式就是一個定義一個策略。

2.2具體實現

首先:定義一個出行接口

/*** 描述:出行策略接口** @author QU* @date 2023/8/10*/
public interface TripModeStrategy {void tripModeStrategy();
}

策略一:自駕出行

/*** 描述: 自駕出行** @author QU* @date 2023/8/10*/
public class CarTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("自駕出行,花費200元,用時6個小時");}
}

策略二:大巴出行

/*** 描述: 公交車出行** @author QU* @date 2023/8/10*/
public class BusTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("公交車出行,花費100元,用時8個小時");}
}

策略三:高鐵出行

/*** 描述: 高鐵出行** @author QU* @date 2023/8/10*/
public class HighSpeedTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("高鐵出行,花費500元,用時2.5小時");}
}

策略四:飛機出行

/*** 描述: 飛機出行** @author QU* @date 2023/8/10*/
public class AircraftTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("飛機出行,花費1000元,用時1個小時");}
}

制定策略輸出類

package strategy.trip;/*** 描述: 策略輸出** @author QU* @date 2023/8/10*/
public class TripMode {//注入策略private TripModeStrategy tripModeStrategy;TripMode(TripModeStrategy tripModeStrategy){this.tripModeStrategy=tripModeStrategy;}//輸出具體策略public void executeTripStrategy(){tripModeStrategy.tripModeStrategy();}
}

制定策略工廠

/*** 描述: 策略工廠** @author QU* @date 2023/8/10*/
public class TripStrategyFactory {/*** 定義map存放所有策略.*/private static final Map<String,TripModeStrategy> TRIP_MODE_STRATEGY_MAP=new HashMap<>();/*** 使用靜態方法來加載策略到map中*/static{TRIP_MODE_STRATEGY_MAP.put(TripEnum.CAR,new CarTripStrategy());TRIP_MODE_STRATEGY_MAP.put(TripEnum.BUS,new BusTripStrategy());TRIP_MODE_STRATEGY_MAP.put(TripEnum.HIGH_SPEED,new HighSpeedTripStrategy());TRIP_MODE_STRATEGY_MAP.put(TripEnum.AIRCRAFT,new AircraftTripStrategy());}/*** 使用靜態方法通過模擬客戶端傳接的類型(參數)** @param key 策略類型(客戶端用戶選擇的出行方式)* @return 具體某條策略*/public static TripModeStrategy tripModeStrategy(String key){TripModeStrategy tripModeStrategy = TRIP_MODE_STRATEGY_MAP.get(key);return tripModeStrategy;}

制定出行類型(出行常量)也可以認為我們wed或實際開發項目中的客戶端選擇的一條策略(用戶選擇的出行方式)

/*** 描述: 出行常量** @author QU* @date 2023/8/10*/
public class TripEnum {public static final String CAR="car";public static final String BUS="bus";public static final String HIGH_SPEED="high_speed";public static final String AIRCRAFT="aircraft";
}

測試類:

/*** 描述: 測試出行方式** @author QU* @date 2023/8/10*/
public class TripTest {public static void main(String[] args) {//自駕TripModeStrategy tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.CAR);//大巴車//tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.BUS);//高鐵//tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.HIGH_SPEED);//飛機tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.AIRCRAFT);TripMode tripMode=new TripMode(tripModeStrategy);tripMode.executeTripStrategy();}
}

運行結果:這里根據程序運行選擇就近原則(最后取變量值),預測是策略四飛機出行

結果:

2.3思路?

  1. 首先根據業務制定出行策略(TripModeStrategy?)
  2. 制定策略工廠將策略裝進我們的靜態代碼塊在工程啟動已執行到map中,靜態方法等待調用(tripModeStrategy(String key))
  3. 制定策略輸出類,通過客戶端選擇出行方式去策略工廠中獲取靜態方法輸出策略

?三.總結

3.1策略模式的特點:

高內聚低耦合,可擴展,遵循ocp原則(開放封閉原則)

?3.2策略模式優點

1.策略模式的功能就是通過抽象、封裝來定義一系列的算法,使得這些算法可以相互替換,所以為這些算法定義一個公共的接口,以約束這些算法的功能實現。如果這些算法具有公共的功能,可以將接口變為抽象類,將公共功能放到抽象父類里面。

2.策略模式的一系列算法是可以相互替換的、是平等的,寫在一起就是if-else組織結構,如果算法實現里又有條件語句,就構成了多重條件語句,可以用策略模式,避免這樣的多重條件語句。

3.擴展性更好:在策略模式中擴展策略實現非常的容易,只要新增一個策略實現類,然后在使用策略實現的地方,使用這個新的策略實現就好了。

3.3策略模式缺點

1.客戶端必須了解所有的策略,清楚它們的不同:

如果由客戶端來決定使用何種算法,那客戶端必須知道所有的策略,清楚各個策略的功能和不同,這樣才能做出正確的選擇,但是這暴露了策略的具體實現。

2.增加了對象的數量:

由于策略模式將每個具體的算法都單獨封裝為一個策略類,如果可選的策略有很多的話,那對象的數量也會很多。

3.只適合偏平的算法結構:

由于策略模式的各個策略實現是平等的關系(可相互替換),實際上就構成了一個扁平的算法結構。即一個策略接口下面有多個平等的策略實現(多個策略實現是兄弟關系),并且運行時只能有一個算法被使用。這就限制了算法的使用層級,且不能被嵌套。

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

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

相關文章

Android數字價格變化的動畫效果的簡單實現

原理&#xff1a;使用ValueAnimator屬性動畫類實現&#xff0c;它通過值的改變手動設置對象的屬性值來實現動畫效果。直接貼代碼&#xff1a; public static void doNumberAnim(TextView tvPrice, float startNumber, float endNumber) {ValueAnimator animator ValueAnimato…

C語言中的 RSA加密和解密算法: 深度探索與實現

C語言中的 RSA加密和解密算法: 深度探索與實現 RSA加密算法是一種非對稱加密算法&#xff0c;即公開密鑰加密&#xff0c;私有密鑰解密。在公開密鑰加密和私有密鑰解密的過程中&#xff0c;密鑰是不同的&#xff0c;這是與其他加密算法的主要區別。RSA算法的安全性依賴于大數分…

ssm+mybatis無法給帶有下劃線屬性賦值問題

原因&#xff1a;mybaitis根據配置&#xff0c;將有下劃線的字段名改為了駝峰格式。 具體見&#xff1a;ssmmybatis無法給帶有下劃線屬性賦值問題&#xff0c;無法獲取數據庫帶下劃線的字段值 - 開發者博客 解決方式&#xff1a; 直接將實體類中的下劃線去掉返回值使用resul…

歸并排序 與 計數排序

目錄 1.歸并排序 1.1 遞歸實現歸并排序&#xff1a; 1.2 非遞歸實現歸并排序 1.3 歸并排序的特性總結: 1.4 外部排序 2.計數排序 2.1 操作步驟: 2.2 計數排序的特性總結: 3. 7種常見比較排序比較 1.歸并排序 基本思想: 歸并排序(MERGE-SORT)是建立在歸并操作上的一種…

代理技術在網絡安全、爬蟲和數據隱私中的多重應用

1. Socks5代理&#xff1a;靈活的數據中轉 Socks5代理協議在網絡通信中起著關鍵作用。與其他代理技術不同&#xff0c;Socks5代理不僅支持TCP連接&#xff0c;還能夠處理UDP流量&#xff0c;使其在需要實時數據傳輸的場景中表現尤為出色。通過將請求和響應中轉到代理服務器&am…

redis分布式集群-redis+keepalived+ haproxy

redis分布式集群架構&#xff08;RedisKeepalivedHaproxy&#xff09;至少需要3臺服務器、6個節點&#xff0c;一臺服務器2個節點。 redis分布式集群架構中的每臺服務器都使用六個端口來實現多路復用&#xff0c;最終實現主從熱備、負載均衡、秒級切換的目標。 redis分布式集…

使用Edge和chrom擴展工具(GoFullPage)實現整頁面截圖或生成PDF文件

插件GoFullPage下載&#xff1a;點擊免費下載 如果在瀏覽網頁時&#xff0c;有需要整個頁面截圖或導出PDF文件的需求&#xff0c;這里分享一個Edge瀏覽器的擴展插件&#xff1a;GoFullPage。 這個工具可以一鍵實現頁面從上到下滾動并截取。 一、打開“管理擴展”&#xff08;…

網絡設備(防火墻、路由器、交換機)日志分析監控

外圍網絡設備&#xff08;如防火墻、路由器、交換機等&#xff09;是關鍵組件&#xff0c;因為它們控制進出公司網絡的流量。因此&#xff0c;監視這些設備的活動有助于 IT 管理員解決操作問題&#xff0c;并保護網絡免受攻擊者的攻擊。通過收集和分析這些設備的日志來監控這些…

Python 3 使用Hadoop 3之MapReduce總結

MapReduce 運行原理 MapReduce簡介 MapReduce是一種分布式計算模型&#xff0c;由Google提出&#xff0c;主要用于搜索領域&#xff0c;解決海量數據的計算問題。 MapReduce分成兩個部分&#xff1a;Map&#xff08;映射&#xff09;和Reduce&#xff08;歸納&#xff09;。…

tauri-react:快速開發跨平臺軟件的架子,支持自定義頭部和窗口陰影效果

tauri-react 一個使用 taurireacttsantd 開發跨平臺軟件的模板&#xff0c;支持窗口頭部自定義和窗口陰影&#xff0c;不用再自己做適配了&#xff0c;拿來即用&#xff0c;非常 nice。 開原地址&#xff1a;GitHub - Sjj1024/tauri-react: 一個最基礎的使用tauri和react開發…

生成式 AI 在泛娛樂行業的應用場景實踐 – 助力風格化視頻內容創作

感謝大家閱讀《生成式 AI 行業解決方案指南》系列博客&#xff0c;全系列分為 4 篇&#xff0c;將為大家系統地介紹生成式 AI 解決方案指南及其在電商、游戲、泛娛樂行業中的典型場景及應用實踐。目錄如下&#xff1a; 《生成式 AI 行業解決方案指南與部署指南》《生成式 AI 在…

一個概率論例題引發的思考

浙江大學版《概率論與數理統計》一書&#xff0c;第13章第1節例2&#xff1a; 這個解釋和模型比較簡單易懂。 接下來&#xff0c;第13章第2節的例2也跟此模型相關&#xff1a; 在我自己的理解中&#xff0c;此題的解法跟上一個題目一樣&#xff0c;其概率如下面的二維矩陣&a…

聊聊計算機技術

目錄 1.計算機的概念 2.計算機的發展過程 3.計算機的作用 4.計算機給人類帶來的福利 1.計算機的概念 計算機是一種用于處理和存儲數據的電子設備。它能夠執行各種操作&#xff0c;比如計算、邏輯操作、數據存儲和檢索等。計算機由硬件和軟件兩部分組成。 計算機的硬件包括中…

Go 語言并發編程 及 進階與依賴管理

1.0 從并發編程本質了解Go高性能的本質 1.1 Goroutine 協程可以理解為輕量級線程&#xff1b; Go更適合高并發場景原因之一&#xff1a;Go語言一次可以創建上萬協成&#xff1b; “快速”&#xff1a;開多個協成 打印。 go func(): 在函數前加 go 代表 創建協程; time.Sleep():…

基于深度信念網絡的西儲大學軸承故障分類識別,基于EMD+DBN的西儲大學軸承故障識別,LCD+DBN,LMD+DBN

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) (EMD,LCD,LMD)+DBN的深度信念網絡的西儲大學軸承故障分類識別 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類…

Nacos使用SpringCloudAlibaba+Dubbo實現

Nacos簡介 Nacos是阿里的一個開源產品&#xff0c;它是針對微服務架構中的服務發現、服務治理、配置管理的綜合型解決方案。 官方介紹是這樣的&#xff1a; Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集&#xff0c;幫助您實現動態服務發現、…

CSDN編程題-每日一練(2023-08-14)

CSDN編程題-每日一練&#xff08;2023-08-14&#xff09; 一、題目名稱&#xff1a;小股炒股二、題目名稱&#xff1a;王子闖閘門三、題目名稱&#xff1a;圓小藝 一、題目名稱&#xff1a;小股炒股 時間限制&#xff1a;1000ms內存限制&#xff1a;256M 題目描述&#xff1a; …

Linux學習之防火墻概述

防火墻分類&#xff1a; 軟件防火墻&#xff1a;常用于數據包的過濾&#xff0c;比如限制某些ip或者端口&#xff0c;進行某些數據的轉發或者傳送 硬件防火墻&#xff1a;防御地域攻擊 軟件防火墻的分類&#xff1a; 包過濾防火墻&#xff1a;控制比較寬泛&#xff0c;防御效果…

ISIS技術(第三十七課)

1 分享一下華為官網上的一張地圖 官網地址:https://support.huawei.com/hedex/hdx.do?docid=EDOC1000105967&id=ZH-CN_CONCEPT_0000001501534705 2 路由的分類 -直連路由 直接連接的路由,且配置了IP地址之后(在同一網段內),就是直連路由。 -非直連路由 -靜態路由…

Shell命令之eval命令

1、基本作用 二次執行命令 2、基本格式 eval command-line3、例如 以下命令無法執行 pipe"|" ls $pipe wc -l ls: -l: No such file or directory ls: wc: No such file or directory ls: |: No such file or directory以下命令可以執行 eval ls $pipe wc -lSh…