当前位置: 首页 > news >正文

策略模式(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.xdnf.cn/news/1174483.html

相关文章:

  • android studio打包vue
  • 如何硬解析 .shp 文件中的几何体,拯救 .dbf、.shx 等文件缺失的 ESRI Shapefile 格式文件
  • .Net core 部署到IIS出现500.19Internal Server Error 解决方法
  • 变频器实习DAY12
  • VRRP技术-设备备份技术
  • Vue3 面试题及详细答案120道(61-75 )
  • Mermaid流程图
  • 思路探索:当大型语言模型遇见数据分析的现实挑战
  • vue3与ue5通信-工具类
  • 【音视频学习】四、深入解析视频技术中的YUV数据存储方式:从原理到实践
  • Kubernetes 服务发布进阶
  • Web后端实战:登录认证(JWT令牌生成和Filter过滤器Interceptor拦截器)
  • 使用 MobaXterm 登录你的阿里云 ECS 实例
  • springboot 3.0 和 2.0 校验用的包不一样
  • 压测软件JMeter安装配置以及创建桌面快捷方式(详细图解)
  • 18.设备虚拟化
  • Java按模板导出Excel
  • YOLOv5模型剪枝实战教程
  • Java项目中定时任务三方工具和技术的深度应用指南
  • Android埋点实现方案深度分析
  • Docker 应用数据备份、迁移方案
  • 设计模式代码总结
  • 【2025】使用vue构建一个漂亮的天气卡片
  • ChatGPT桌面版深度解析
  • vue3笔记(2)自用
  • RCE随笔-奇技淫巧(2)
  • Android toybox常用工具介绍
  • ES6 标签模板:前端框架的灵活利器
  • mongodb的备份和还原(精简)
  • 微算法科技(NASDAQ: MLGO)研究量子机器学习算法 (Quantum Machine Learning Algorithms),加速机器学习任务