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 |
具體策略實現 |
|
上下文(調用者) | 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):父類提供默認實現或結構,子類定制行為
這是一種常見的組合設計,用于提供靈活可擴展的行為策略選擇 + 統一結構規范的場景。
僅供學習參考,如有侵權聯系我刪除。?