当前位置: 首页 > 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.dtcms.com/a/294641.html

相关文章:

  • 水泥厂码垛环节的协议转换实践:从Modbus TCP到DeviceNet
  • opencv学习(图像读取)
  • CPU,减少晶体管翻转次数的编码
  • haproxy算法
  • LSTM学习笔记
  • unity小:webgl开发注意事项(持续更新)
  • 2025年7月Nature子刊-Adam梯度下降优化算法Adam Gradient Descent-附Matlab免费代码
  • CVE-2025-32463漏洞:sudo权限提升漏洞全解析
  • OpenLayers 快速入门(五)Controls 对象
  • 西安旅游行业从业者:凤凰新闻怎么发稿有哪些注意事项
  • 编程日常开发工具整理
  • 智能工具重塑光伏设计:精准、高效与科学的融合
  • 第二章 W55MH32 DHCP示例
  • 安卓项目--基于百度云的人脸识别考勤系统
  • 基于沁恒微电子CH32V307单片机使用
  • 前端项目下载发票pdf文件要求改文件名笔记
  • LLM指纹底层技术——模型压缩与优化
  • Windows安装git教程(图文版)
  • 批量剪辑矩阵分发系统源码搭建,支持OEM
  • 电机驱动-理论学习-FOC算法理解
  • [硬件电路-73]:模拟器件 - 什么是电路的信号振铃现象?其根本原因?如何解决?
  • 逆向入门(41)程序逆向篇-crackme
  • Rocky9.4部署Zabbix7
  • WebGIS 中常用公共插件
  • 星座占卜信息分享静态网站项目练习!
  • 【大模型文生图、文生音频实战Demo】基于Spring AI Alibaba和阿里百炼大模型实现文生图、文生视频
  • LeetCode 407:接雨水 II
  • 网络编程初识(详细易懂)
  • [强网杯 2019]高明的黑客
  • iOS加固工具有哪些?企业级团队协作视角的实战分析