策略模式(Strategy Pattern)+ 模板方法模式(Template Method Pattern)的組合使用

using Microsoft.Extensions.DependencyInjection;namespace ConsoleApp9
{internal class Program{static async Task Main(string[] args){Console.WriteLine("Hello, World!");// 創建并配置依賴注入容器var _serviceProvider = new ServiceCollection().AddScoped<IStrategyService, CarStrategyService>()  // 注冊 Car Travel 策略.AddScoped<IStrategyService, PublicTransportationStrategyService>() // 注冊 Public Transport 策略.AddScoped<IStrategyService, BicycleStrategyService>() // 注冊 Bicycle 策略.BuildServiceProvider();//我改寫的IStrategyService _strategyService;_strategyService = new CarStrategyService();var result = _strategyService.ReplaceDefaultReference("Hello [身份證] 祝您 [出行方式] 愉快");Console.WriteLine(result);Console.WriteLine();IStrategyService _strategyService_2;//客戶選擇出行方式為開車var TravleMode = CTravelFlag.Bicycle;using (var scope = _serviceProvider.CreateScope()){_strategyService_2 = scope.ServiceProvider.GetService<IEnumerable<IStrategyService>>().FirstOrDefault(s => s.TravelFlag == TravleMode);if (_strategyService_2 == null){Console.WriteLine("No matching travel strategy found.");return;}var result_2 = _strategyService_2.ReplaceDefaultReference("Hello [身份證] 祝您 [出行方式] 愉快_2");Console.WriteLine(result_2);}}}public interface IStrategyService{CTravelFlag TravelFlag { get; }Task<string> ReplaceReference(string content);string ReplaceDefaultReference(string content);}[Flags]public enum CTravelFlag{None = 0,Car = 1,PublicTransportation = 1 << 1,      //2Bicycle = 1 << 2,                   //4Walking = 1 << 3,                   //8Taxi = 1 << 4,                      //16Train = 1 << 5,                     //32All = Car | PublicTransportation | Bicycle | Walking | Taxi | Train,}public abstract class StrategyService : IStrategyService{public virtual CTravelFlag TravelFlag => CTravelFlag.All;public virtual string ReplaceDefaultReference(string content){//throw new NotImplementedException();Console.WriteLine("所有出行方式都得帶身份證和錢包");content = content.Replace("[身份證]", "王先生");return content;}public virtual Task<string> ReplaceReference(string content){throw new NotImplementedException();}}public class CarStrategyService : StrategyService{public override CTravelFlag TravelFlag => CTravelFlag.Car;public override string ReplaceDefaultReference(string content){Console.WriteLine("客戶選擇了開車出行");content = base.ReplaceDefaultReference(content);return content.Replace("[出行方式]", "駕車出行");}public override async Task<string> ReplaceReference(string content){throw new NotImplementedException();}}public class PublicTransportationStrategyService : StrategyService{public override CTravelFlag TravelFlag => CTravelFlag.PublicTransportation;public override string ReplaceDefaultReference(string content){Console.WriteLine("客戶選擇了公共交通");content = base.ReplaceDefaultReference(content);return content.Replace("[出行方式]", "公共交通出行");}public override async Task<string> ReplaceReference(string content){throw new NotImplementedException();}}public class BicycleStrategyService : StrategyService{public override CTravelFlag TravelFlag => CTravelFlag.Bicycle;public override string ReplaceDefaultReference(string content){Console.WriteLine("客戶選擇了自行車");content = base.ReplaceDefaultReference(content);return content.Replace("[出行方式]", "自行車出行");}public override async Task<string> ReplaceReference(string content){throw new NotImplementedException();}}}

輸出:

Hello, World!
客戶選擇了開車出行
所有出行方式都得帶身份證和錢包
Hello 王先生 祝您 駕車出行 愉快客戶選擇了自行車
所有出行方式都得帶身份證和錢包
Hello 王先生 祝您 自行車出行 愉快_2

🧩 一、核心設計模式分析

? 1. 策略模式(Strategy Pattern)

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

在你的代碼中的體現:

角色對應代碼
抽象策略接口IStrategyService
具體策略實現

CarStrategyService

PublicTransportationStrategyService

BicycleStrategyService

上下文(調用者)Main 方法中使用接口調用
IStrategyService _strategyService;
_strategyService = new CarStrategyService();

?👉 這段代碼就是典型的策略模式應用 —— 在運行時可以替換不同的策略類來完成不同的行為(比如不同的證書替換策略)。


? 2. 模板方法模式(Template Method Pattern)

定義:
模板方法模式在一個抽象類中定義一個操作的骨架,將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

在你的代碼中的體現:

角色對應代碼
抽象父類StrategyService
鉤子方法或默認實現ReplaceDefaultReference / ReplaceReference
public abstract class StrategyService : IStrategyService
{public virtual CTravelFlag TravelFlag => CTravelFlag.All;public virtual string ReplaceDefaultReference(string content){//throw new NotImplementedException();Console.WriteLine("所有出行方式都得帶身份證和錢包");content = content.Replace("[身份證]", "王先生");return content;}public virtual Task<string> ReplaceReference(string content){throw new NotImplementedException();}
}

?子類 CarStrategyService可以覆蓋虛方法,自定義某些步驟。


? 總結

你的代碼體現的是:

  • 策略模式(Strategy Pattern):可替換的出行方式處理策略

  • 模板方法模式(Template Method Pattern):父類提供默認實現或結構,子類定制行為

這是一種常見的組合設計,用于提供靈活可擴展的行為策略選擇 + 統一結構規范的場景。


僅供學習參考,如有侵權聯系我刪除。?

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

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

相關文章

es0102---語法格式、數據類型、整合springboot、創建庫、創建映射、新增數據、自定義查詢

ES 一、創建映射字段的語法格式 需要先構建索引庫&#xff0c;在構建索引庫中的映射關系 PUT /索引庫名/_mapping {"properties": {"字段名": {"type": "類型","index": true&#xff0c;"store": false&#…

spring boot h2數據庫無法鏈接問題

spring boot h2數據庫無法鏈接問題datasource:# 數據庫連接地址&#xff1a;H2在2.x后&#xff0c;不再支持創建數據庫&#xff0c;需要手工創建&#xff0c;如&#xff1a;touch test.mv.db&#xff0c;# 否則會報“Database file not found”錯誤url: jdbc:h2:file:~/testdri…

pycharm配conda環境

最近在做表情包&#xff0c;畫出來的表情包大小不一&#xff0c;但是vx表情包平臺要求統一都是240*240的&#xff0c;所以用Pillow統一處理的一下。 如果你本地裝的python并且添加到path了&#xff0c;pycharm可以自動獲取到&#xff0c;但是我裝得miniconda&#xff0c;pychar…

【Elasticsearch】Elasticsearch 跨機房部署

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1?? 冷熱集群架構2?? 合適的鍋炒合適的菜&#xff1a;性能與成本平衡原理公式解析3?? ILM&#xff08;Index Lifecycle Management&#xff09;策略詳解4?? Elasticsearch 跨機房部署5?? 快照與恢…

立式數控深孔鉆的工藝及光學檢測方法 —— 激光頻率梳 3D 輪廓檢測

引言立式數控深孔鉆作為深孔加工的關鍵設備&#xff0c;其工藝水平直接影響零件加工質量。深孔加工面臨排屑、散熱等挑戰&#xff0c;而光學檢測技術的發展為深孔加工精度控制提供了新途徑。激光頻率梳 3D 輪廓檢測技術與立式數控深孔鉆工藝的結合&#xff0c;實現了深孔加工與…

【YOLO系列】YOLOv4詳解:模型結構、損失函數、訓練方法及代碼實現

YOLOv4詳解&#xff1a;模型結構、損失函數、訓練方法及代碼實現 motivation YOLO系列作者Joseph Redmon與Alexey Bochkovskiy致力于解決目標檢測領域的核心矛盾&#xff1a;精度與速度的平衡。YOLOv4的誕生源于兩大需求&#xff1a; 工業落地&#xff1a;在移動端/邊緣設備…

chromedriver下載與安裝方法

chromedriver下載地址&#xff1a; 版本在&#xff1a;http://chromedriver.storage.googleapis.com/index.html 這是下載后&#xff1a; 把exe文件復制到瀏覽器的安裝目錄下 把exe文件復制到python的安裝目錄下 配置環境變量:此電腦→右擊屬性→高級系統設置→環境變量→用戶…

基于QT(C++)實現(圖形界面)選課管理系統

選課管理系統1 概述1.1 課程設計目的和意義根據課程大綱設定&#xff0c;面向對象課程設計的目的是&#xff1a;&#xff08;1&#xff09;理解面向對象的基本思想和三大機制&#xff0c;掌握基于 C 語法的面向對象的基 本概念和開發模式&#xff0c;熟練運用面向對象思維模式…

【阿里云-ACP-1】疑難題解析

1.彈性伸縮 AS 在企業中有廣泛的應用場景,不僅適合業務量不斷波動的應用程序,同時也適合業務量穩定的應用程序。以下關于彈性伸縮的使用說法正確的是( ) 選項內容 A 彈性伸縮可以用于云數據庫 RDS 的自動擴容 B 彈性伸縮支持自動將 ECS 實例或 ECI 實例添加到 Memcache 實…

NLP:seqtoseq英譯法案例

本文目錄&#xff1a;一、案例概述二、數據集三、案例步驟&#xff08;一&#xff09;導入工具包和工具函數&#xff08;二&#xff09;數據預處理&#xff08;三&#xff09;構建數據源對象&#xff08;四&#xff09;構建數據迭代器&#xff08;五&#xff09;構建基于GRU的編…

docker的準備與部署

docker的重復使用bilibli 黑馬視頻 方便查看docker容器。設置格式通過官網dock查看格式命令 命令別名&#xff0c;簡化輸入

Java 大視界 -- Java 大數據在智能教育自適應學習路徑規劃與學習效果強化中的應用(362)

Java 大視界 -- Java 大數據在智能教育自適應學習路徑規劃與學習效果強化中的應用(362) 引言: 正文: 一、Java 構建的智能教育數據架構 1.1 多維度學習數據實時采集 1.2 知識圖譜構建與知識點關聯 二、Java 驅動的自適應學習路徑規劃 2.1 多模型融合的路徑生成 2.2 學習效果…

2.1 為什么定義tensor數據結構?

PyTorch選擇定義Tensors而非直接使用NumPy進行運算和數據處理&#xff0c;主要是因為Tensors在功能、性能和場景適配性上更貼合深度學習的需求。以下是關鍵原因分析&#xff1a; 1. 自動求導與計算圖支持 核心差異&#xff1a;PyTorch的Tensors在運算時會自動構建計算圖&#x…

Qt Quick 3D渲染

Qt Quick 3D是Qt框架中用于創建3D圖形界面的強大模塊&#xff0c;它提供了聲明式的QML API&#xff0c;使得開發者無需深入底層圖形API就能構建復雜的3D場景。本文將全面介紹Qt Quick 3D的核心概念和技術細節&#xff0c;包括3D場景坐標系統、場景環境設置、光照與材質系統、相…

筆試——Day17

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 小樂樂改數字 思路 模擬 當前位置為偶數時&#xff0c;改為0&#xff1b;否則改為1記得取出前導0&#xff1b;stoi()函數可以直接自動去除前導0 代碼 第二題 題目&a…

【c#】完美解決部署IIS 報錯 0x8007000d

1、錯誤頁面&#xff1a;2、解決思路&#xff1a; 1、點擊IIS站點&#xff0c;右鍵點擊瀏覽到文件夾下&#xff0c;路徑打開cmd&#xff0c;找到對應的站點的dll&#xff0c;運行失敗會提示錯誤原因。需要安裝某些dll2、選中站點&#xff0c;點擊模塊&#xff0c;檢查模塊AspNe…

Visual Studio 2010-.Net Framework 4.0項目-NPOI安裝

在管理Nuget程序包中搜索NPOI&#xff0c;下載最新版會報錯&#xff1a;使用程序包控制臺輸入&#xff1a;Install-Package NPOI -Version 2.5.1

Redis原理之分布式鎖

上篇文章&#xff1a; Redis原理之緩存https://blog.csdn.net/sniper_fandc/article/details/149141968?fromshareblogdetail&sharetypeblogdetail&sharerId149141968&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link??????? 目錄 1 …

網絡基礎19:OSPF單區域原理實驗

一、實驗拓撲二、設備配置AR1 配置<AR1> system-view [AR1] interface GigabitEthernet0/0/0 [AR1-GigabitEthernet0/0/0] ip address 192.168.1.1 24 [AR1-GigabitEthernet0/0/0] quit[AR1] ospf 1 router-id 0.0.0.1 [AR1-ospf-1] area 0 [AR1-ospf-1-area-0.0.0.0] ne…

【實戰推薦】小白也能上手的多端陪玩系統平臺項目源碼

在當今的游戲市場中&#xff0c;游戲陪玩服務已經成為了一個熱門領域。無論是尋找高手帶自己升級、學習游戲技巧&#xff0c;還是僅僅想找人一起玩耍&#xff0c;越來越多的玩家傾向于通過專業的陪玩平臺找到合適的伙伴。對于想要進入這個市場的創業者和開發者來說&#xff0c;…