当前位置: 首页 > 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.lryc.cn/news/597431.html

相关文章:

  • AR维修辅助系统UI设计:虚实融合界面中的故障标注与操作引导
  • 设计模式(单例)
  • ar景区导航导览开发方案:核心技术架构与功能设计
  • HarmonyOS学习记录5
  • 第三章.Redis渐进式遍历
  • 计算机毕设分享-基于SpringBoot的房屋租赁系统(开题报告+源码+Lun文+开发文档+数据库设计文档)
  • 神经架构搜索革命:从动态搜索到高性能LLM的蜕变之路
  • Spark实现WorldCount执行流程图
  • 05-ES6
  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(2)
  • UE5多人MOBA+GAS 29、创建一个等级UI
  • k8s中的configmap存储
  • K8s:离线部署Kubernetes1.26.12及采用外部Harbor
  • CSP-J系列【2023】P9751 [CSP-J 2023] 旅游巴士题解
  • 视频孪生赋能数字住建:构建智慧城市新蓝图​
  • 绿地集团携手深兰科技推动AI医诊大模型快速落地
  • 【补题】Codeforces Round 1000 (Div. 2) C. Remove Exactly Two
  • Python 爬虫(一):爬虫伪装
  • .NET-键控服务依赖注入
  • C 语言基础第9天:一、二维数组
  • 基于Python的新闻爬虫:实时追踪行业动态
  • 网络调制技术对比表
  • 【CNN】模型评估标准
  • 开源新基准!OmniGen2 文本图像对齐度提升 8.6%,视觉一致性超越现有开源模型15%
  • MIPI DSI 转 1LVDS ,分辨率1920*1080.
  • 变频器带动电机:全方位解析参数变化
  • 14. 如何获取用户浏览器内核
  • 【无标题】word 中的中文排序
  • Docker详解及实战
  • Oracle物化视图详解