【設計模式】GoF設計模式之策略模式(Strategy Pattern)

設計模式之策略模式 Strategy Pattern

    • V1.0
    • 核心概念
    • 角色
    • 代碼示例
      • 程序運行結果
      • 代碼講解
    • 適用范圍

V1.0

核心概念

策略模式是一種行為型設計模式,其核心思想是業務類執行某個動作時,可以使用該動作的不同的實現,并在程序運行中可以切換使用該動作的不同的實現。

不同的動作的實現被封裝為不同的類,這些具體實現類繼承統一的接口,因此業務類可以持有任一動作具體實現,并可以對其進行替換。

角色

  • Strategy(策略接口):定義了動作的統一接口,具體策略需要實現該接口。
  • ConcreteStrategy(具體策略):實現了策略接口,不同的具體策略實現了同一動作的不同實現。
  • Context(上下文):持有具體策略的引用,在業務中執行具體策略,并可以更換不同的具體策略,以使用同一動作的不同的實現方式。

代碼示例

/// <summary>
/// 交通方式策略接口,定義了動作的統一接口
/// </summary>
public interface ITransportationMode
{public void Travel();
}/// <summary>
/// 具體策略,乘坐飛機
/// </summary>
public class ConcreteModeAirplane:ITransportationMode
{public void Travel(){Console.WriteLine("Travel by airplane");}
}/// <summary>
/// 具體策略,乘坐火車
/// </summary>
public class ConcreteModeTrain : ITransportationMode
{public void Travel(){Console.WriteLine("Travel by train");}
}/// <summary>
/// 具體策略,乘坐長途汽車
/// </summary>
public class ConcreteModeCoach : ITransportationMode
{public void Travel(){Console.WriteLine("Travel by coach");}
}/// <summary>
/// 上下文類,可以使用不同的出行方式出行
/// </summary>
public class ContextTravelPlan
{/// <summary>/// 出行方式/// </summary>public ITransportationMode mean;public ContextTravelPlan(ITransportationMode mean){this.mean = mean;}/// <summary>/// 更換策略,即出行方式/// </summary>/// <param name="newMean"></param>public void setMean(ITransportationMode newMean){this.mean = newMean;}public void travelTo(string place){mean.Travel();Console.WriteLine($"Traveled to {place}");}
}public class Program
{public static void Main(string[] arg){//建立具體策略對象ConcreteModeAirplane meanAirplane = new();ConcreteModeTrain meanTrain = new();ConcreteModeCoach meanCoach = new();//建立旅行計劃上下文類ContextTravelPlan ctp = new(meanAirplane);//使用飛機方式出行ctp.travelTo("Shanghai");//更換策略,使用火車出行方式ctp.setMean(meanTrain);//使用火車方式出行ctp.travelTo("Chongqing");//更換策略,使用長途汽車出行方式ctp.setMean(meanCoach);//使用長途汽車出行ctp.travelTo("Jinan");}
}

程序運行結果

Travel by airplane
Traveled to Shanghai
Travel by train
Traveled to Chongqing
Travel by coach
Traveled to Jinan

代碼講解

  • ITransportationMode接口:策略接口,定義了交通方式的統一接口Travel,具體的交通方式需要實現這個接口。
  • ConcreteModeAirplane類:具體策略,實現了交通方式接口Travel,為乘坐飛機出行,接口實現中輸出了乘坐飛機出行的信息。
  • ConcreteModeTrain類:具體策略,實現了交通方式接口Travel,為乘坐火車出行,接口實現中輸出了乘坐火車出行的信息。
  • ConcreteModeCoach類:具體策略,實現了交通方式接口Travel,為乘坐長途汽車出行,接口實現中輸出了乘坐長途汽車出行的信息。
  • ContextTravelPlan類:上下文類,是具體的業務邏輯,構造時使用具體出行方式對象(具體策略對象)構建,并可以使用setMean方法替換具體出行方式(具體策略)。toTravel方法是上下文類的具體的業務邏輯,其中使用其持有的出行方式mean,出行到指定的地方。
  • Program類:客戶端代碼,創建了具體出行方式(具體策略),使用飛機出行方式meanAirplane創建了出行上下文類,執行出行動作。更換出行方式,即具體策略,再次進行出行動作,重復2次。

適用范圍

  • 當一個動作可能有多種實現,并且需要在不同時間修改使用不同的動作實現時。
  • 將來可能添加新的動作實現的場景,使用策略模式可以不修改現有的代碼。

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

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

相關文章

VS Code配置指南:打造高效的QMK開發環境

VS Code配置指南&#xff1a;打造高效的QMK開發環境 前言 你是否曾為QMK固件開發環境的搭建而頭疼不已&#xff1f;本文將手把手教你使用Visual Studio Code&#xff08;簡稱VS Code&#xff09;這款強大的代碼編輯器來構建一個完美的QMK開發環境&#xff0c;讓你的鍵盤固件開…

java CompletableFuture 異步編程工具用法1

1、測試異步調用&#xff1a; static void testCompletableFuture1() throws ExecutionException, InterruptedException {// 1、無返回值的異步任務。異步線程執行RunnableCompletableFuture.runAsync(() -> System.out.println("only you"));// 2、有返回值的異…

中國自動駕駛研發解決方案,第一!

4月28日&#xff0c;IDC《中國汽車云市場(2024下半年)跟蹤》報告發布&#xff0c;2024下半年中國汽車云市場整體規模達到65.1億元人民幣&#xff0c;同比增長27.4%。IDC認為&#xff0c;自動駕駛技術深化與生成式AI的發展將為汽車云打開新的成長天花板&#xff0c;推動云計算在…

如何快速獲取字符串的UTF-8或UTF-16編碼二進制數據?數值轉換成字符串itoa不是C標準?其它類型轉換成字符串?其它類型轉換成數值類型?

目錄 如何快速獲取字符串的UTF-8或UTF-16編碼二進制數據? 數值轉換成字符串itoa不是C標準&#xff1f; 其它類型轉換成字符串 其它類型轉換成數值類型 轉換成數值的API 為什么有的編程語言允許字符串和整數相加? 字符串拼接 字符串字面量自動連接 如何快速獲取字符串…

Android SDK 國內鏡像及配置方法(2025最新,包好使!)

2025最新android sdk下載配置 1、首先你需要有android sdk manager2、 直接上教程修改hosts文件配置域名映射即可(不用FQ)2.1 獲取ping dl.google.com域名ip地址2.2 配置hosts文件域名映射2.3 可以隨意下載你需要的sdk3、 總結:走過彎路,踩過坑!!!大家就不要踩了!避坑1…

MySQL事務隔離機制與并發控制策略

MySQL事務隔離機制與并發控制策略 MySQL事務隔離機制與并發控制策略一、數據庫并發問題全景解析二、事務隔離級別深度解析三、MySQL并發控制核心技術1. 多版本并發控制&#xff08;MVCC&#xff09;2. 鎖機制 四、隔離級別實現差異對比五、生產環境最佳實踐六、高級優化技巧七、…

Python `zip()` 函數是什么

Python zip() 函數是什么 在 Python 里,zip() 是一個內置函數,其主要作用是將多個可迭代對象(像列表、元組、字符串等)中的元素一一對應地組合成元組,最終返回一個迭代器,這個迭代器會生成這些元組。 基本語法 zip(*iterables)其中,*iterables 代表可變數量的可迭代對…

Jenkins 改完端口號啟動不起來了

讓我們將 Jenkins 恢復到默認的 8080 端口&#xff0c;確保它能正常啟動&#xff1a; 1. 修改 Jenkins 的配置文件&#xff1a; sudo nano /etc/default/jenkins 將內容修改為&#xff1a; HTTP_PORT8080 JENKINS_ARGS"--webroot/var/cache/jenkins/war --httpPort8080…

【AWS+Wordpress-準備階段】AWS注冊+創建EC2實例

前言 自學筆記&#xff0c;解決問題為主&#xff0c;親測有效&#xff0c;歡迎補充。 本地WP文件部署到AWS整體步驟如下&#xff1a;&#xff08;本文重點&#xff1a;AWS準備完成&#xff09; 0. [AWS 準備] 注冊 AWS 并創建 EC2 實例 ↓ 1. [生成安裝包&#xff1a;用 Du…

使用pytorch保存和加載預訓練的模型方法

需要使用到的函數 在 PyTorch 中&#xff0c;torch.save() 和 torch.load() 是用于保存和加載模型的核心函數。 torch.save() 函數 主要用途&#xff1a;將模型或模型的狀態字典&#xff08;state_dict&#xff09;保存到文件中。 語法&#xff1a; torch.save(obj, f, pi…

Python從入門到高手8.3節-元組的常用操作方法

目錄 11.3.1 元組的常用操作方法 11.3.2 元組的查找 11.3.3 祈禱明天不再打雷下雨 11.3.1 元組的常用操作方法 元組類型是一種抽象數據類型&#xff0c;抽象數據類型定義了數據類型的操作方法&#xff0c;在本節的內容中&#xff0c;著重介紹元組類型的操作方法。 ? 元組是…

圖書推薦(協同過濾)算法的實現:基于訂單購買實現相似用戶的圖書推薦

代碼部分 package com.ruoyi.system.service.impl;import com.ruoyi.system.domain.Book; import com.ruoyi.system.domain.MyOrder; import com.ruoyi.system.mapper.BookMapper; import com.ruoyi.system.mapper.MyOrderMapper; import com.ruoyi.system.service.IBookRecom…

JMeter快速指南:命令行生成HTML測試報告(附樣例命令解析)

一、核心命令解析 jmeter -g Dash_CapacityTest_01_AllModules_1000.jtl -o report/ 參數 作用 示例文件說明 -g 指定.jtl結果文件路徑 -o 指定報告輸出目錄 自動創建report文件夾 二、操作步驟&#xff08;Windows/Linux/Mac通用&#xff09; 進入JMe…

2025年滲透測試面試題總結-滲透崗位全職工作面試(附回答)(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 一、通用基礎類問題 1. 自我介紹 2. 職業動機與規劃 3. 加班/出差接受度 二、安全技術類問題 1. 漏…

使用DEEPSEEK快速修改QT創建的GUI

QT的GUI&#xff0c;本質上是使用XML進行描述的&#xff0c;在QT CREATOR的界面編輯處&#xff0c;按CTRL2 切換到代碼視圖&#xff0c;CTRL3切換到編輯器視圖。 CTRL2 切換到代碼視圖 CTRL3 切換到編輯器視圖 鼠標左鍵點擊代碼視圖中&#xff0c;按CTRLA → CTRLC復制XML代碼…

draw.io流程圖使用筆記

文章目錄 圖形較少的問題安裝版好還是非安裝版好業務系統嵌入的draw.io如何導入呢?如何判斷組合和取消組合如何快速選中框里面的內容有時候選不到文本怎么辦連接線如何不走直角 航點和取消航點支持多少種圖形多個連接點?多個圖形對齊雙向箭頭如何畫圖形的大小 其他流程圖圖標…

音頻相關基礎知識

主要參考&#xff1a; 音頻基本概念_音頻和音調的關系-CSDN博客 音頻相關基礎知識&#xff08;采樣率、位深度、通道數、PCM、AAC&#xff09;_音頻2通道和8ch的區別-CSDN博客 概述 聲音的本質 聲音的本質是波在介質中的傳播現象&#xff0c;聲波的本質是一種波&#xff0c;是一…

MySQL中隔離級別那點事

引言 在MySQL中&#xff0c;事務隔離級別和二進制日志&#xff08;binlog&#xff09;的格式密切相關&#xff0c;直接影響數據的一致性和復制的正確性。尤其是在“已提交讀”&#xff08;Read Committed&#xff09;隔離級別下&#xff0c;由于沒有使用間隙鎖&#xff0c;某些…

LeetCode 熱題 100 238. 除自身以外數組的乘積

LeetCode 熱題 100 | 238. 除自身以外數組的乘積 大家好&#xff0c;今天我們來解決一道經典的算法問題——除自身以外數組的乘積。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求在不使用除法的情況下&#xff0c;計算數組中每個元素的乘積&#xff0c;其中每個元素的…

【網絡編程】三、TCP網絡套接字編程

文章目錄 TCP通信流程Ⅰ. 服務器日志類實現Ⅱ. TCP服務端1、服務器創建流程2、創建套接字 -- socket3、綁定服務器 -- bind&#x1f38f;4、服務器監聽 -- listen&#x1f38f;5、獲取客戶端連接請求 -- acceptaccept函數返回的套接字描述符是什么&#xff0c;不是已經有一個了…