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

C#设计模式深度解析:经典实现与现代演进 ——基于《设计模式》的.NET技术实践

一、设计模式与C#语言特性融合

C#凭借其面向对象特性、泛型、委托/事件、LINQ等能力,为设计模式提供了更优雅的实现方式。以下通过典型模式展现其技术融合:

1. 工厂方法模式 + 泛型约束

public interface IProduct<T> where T : new()  
{void Operate();
}public class ConcreteProduct<T> : IProduct<T> where T : new()
{public void Operate() => Console.WriteLine($"Product {typeof(T).Name}");
}public class GenericFactory<T> where T : IProduct<T>, new()
{public T Create() => new T();
}// 使用
var factory = new GenericFactory<ConcreteProduct<MyType>>();
var product = factory.Create();

技术要点:

• 泛型工厂实现类型安全的产品创建
• new()约束确保子类具有默认构造函数
• 符合开放-封闭原则,扩展时无需修改工厂类

2. 观察者模式 + 事件委托

public class Subject  
{public event EventHandler<EventArgs> StateChanged;private int _state;public int State  {get => _state;set {_state = value;OnStateChanged();}}protected virtual void OnStateChanged() => StateChanged?.Invoke(this, EventArgs.Empty);
}public class Observer  
{public void Subscribe(Subject subject) => subject.StateChanged += HandleStateChange;private void HandleStateChange(object sender, EventArgs e) =>Console.WriteLine($"State updated to {((Subject)sender).State}");
}// 使用
var subject = new Subject();
var observer = new Observer();
observer.Subscribe(subject);
subject.State = 42;

优势分析:

• 利用C#内置事件机制消除传统观察者的样板代码
• 避免显式注册/注销接口的实现
• 支持多播委托,天然支持多个观察者


二、创建型模式在DI容器中的蜕变

现代.NET Core的依赖注入容器将工厂模式推向新高度:

1. 建造者模式与Options模式

public class ServiceConfig  
{public string Endpoint { get; set; }public int Timeout { get; set; }
}public static class ServiceCollectionExtensions  
{public static IServiceCollection ConfigureMyService(this IServiceCollection services, Action<ServiceConfig> configure){var config = new ServiceConfig();configure(config);services.AddSingleton(config);services.AddTransient<MyService>();return services;}
}// 启动配置
services.ConfigureMyService(opt => {opt.Endpoint = "https://api.example.com";opt.Timeout = 30;
});

模式演进:

• 将对象构造过程封装为流畅接口
• 通过Action委托实现配置的延迟绑定
• 符合现代ASP.NET Core配置范式


三、行为型模式的函数式实现

C#的函数式特性为传统行为模式提供新思路:

1. 策略模式 + Lambda表达式

public class PaymentProcessor  
{private Func<decimal, bool> _paymentStrategy;public void SetPaymentStrategy(Func<decimal, bool> strategy) => _paymentStrategy = strategy;public bool ProcessPayment(decimal amount) => _paymentStrategy?.Invoke(amount) ?? false;
}// 使用
var processor = new PaymentProcessor();
processor.SetPaymentStrategy(amt => CreditCardService.Charge(amt, "4111111111111111"));
var result = processor.ProcessPayment(100m);

价值提升:

• 消除策略接口的显式定义
• 支持运行时动态替换算法
• 与LINQ表达式树结合可实现更复杂策略

2. 责任链模式 + 中间件管道

ASP.NET Core中间件本质是责任链模式的应用:

public class LoggingMiddleware  
{private readonly RequestDelegate _next;public LoggingMiddleware(RequestDelegate next) => _next = next;public async Task InvokeAsync(HttpContext context)  {LogRequest(context.Request);await _next(context);LogResponse(context.Response);}
}// 管道配置
app.UseMiddleware<LoggingMiddleware>();
app.UseMiddleware<AuthenticationMiddleware>();

架构意义:

• 每个中间件只关注单一职责
• 通过RequestDelegate实现链式传递
• 支持动态插入/移除处理节点


四、结构型模式在跨进程通信中的应用

1. 代理模式 + gRPC服务

// 定义服务契约
public interface IDataService  
{Task<DataResponse> GetData(DataRequest request);
}// 客户端代理
public class DataServiceProxy : IDataService  
{private readonly Channel _channel;private readonly DataService.DataServiceClient _client;public DataServiceProxy(string address)  {_channel = new Channel(address, ChannelCredentials.Insecure);_client = new DataService.DataServiceClient(_channel);}public async Task<DataResponse> GetData(DataRequest request) => await _client.GetDataAsync(request);
}// 使用
var proxy = new DataServiceProxy("localhost:50051");
var response = await proxy.GetData(new DataRequest { Id = 123 });

模式升级:

• 将本地接口代理转换为远程服务调用
• 自动处理序列化/反序列化
• 支持负载均衡与熔断机制


五、模式反模式:C#特定场景的陷阱

1. 单例模式的线程安全实现

public class Singleton  
{private static readonly Lazy<Singleton> _instance = new Lazy<Singleton>(() => new Singleton(), true);private Singleton() { }public static Singleton Instance => _instance.Value;
}

最佳实践:

• 使用Lazy实现延迟初始化
• 确保线程安全的实例创建
• 防止反射攻击的构造函数保护

2. 装饰器模式与扩展方法

public interface IDataCache  
{string Get(string key);
}public class DataCache : IDataCache { /* 基础实现 */ }public static class DataCacheDecorators  
{public static IDataCache WithLogging(this IDataCache cache) => new LoggingDecorator(cache);
}public class LoggingDecorator : IDataCache  
{private readonly IDataCache _inner;public LoggingDecorator(IDataCache inner) => _inner = inner;public string Get(string key)  {Console.WriteLine($"Accessing key: {key}");return _inner.Get(key);}
}// 使用
var cache = new DataCache().WithLogging();

创新点:

• 通过扩展方法实现流畅装饰
• 保持接口一致性
• 支持多层装饰器嵌套


六、现代架构的模式融合

1. CQRS模式与Mediator模式

public interface ICommandHandler<TCommand>  
{Task Handle(TCommand command);
}public class CreateUserHandler : ICommandHandler<CreateUserCommand>  
{public Task Handle(CreateUserCommand command)  {// 实现业务逻辑return Task.CompletedTask;}
}public class Mediator  
{private readonly IServiceProvider _provider;public Mediator(IServiceProvider provider) => _provider = provider;public Task Send<TCommand>(TCommand command)  {var handler = _provider.GetService<ICommandHandler<TCommand>>();return handler.Handle(command);}
}// 使用
var mediator = new Mediator(serviceProvider);
await mediator.Send(new CreateUserCommand { Name = "Alice" });

架构价值:

• 解耦命令发起者与处理者
• 支持横切关注点(如日志、验证)的集中处理
• 符合单一职责原则


结论:C#设计模式的演进图谱

模式类型 传统实现 现代演进
创建型 简单工厂 DI容器 + Options模式
结构型 类适配器 跨进程服务代理(gRPC/DAPR)
行为型 接口策略 函数委托 + 表达式树
在.NET 6+与云原生时代,C#设计模式呈现三大趋势:
1. 声明式编程:通过特性注解替代显式模式实现
2. 响应式融合:结合Rx.NET实现事件驱动架构
3. 元编程赋能:利用Source Generator自动生成模式代码
掌握模式本质而非具体实现形式,方能在复杂系统设计中游刃有余。


参考文献

  1. 《设计模式:可复用面向对象软件的基础》GoF
  2. 《C# in Depth》Jon Skeet
  3. .NET官方文档:Dependency Injection in ASP.NET Core
  4. gRPC官方文档:C# Quick Start Guide

相关文章:

C#设计模式深度解析:经典实现与现代演进 ——基于《设计模式》的.NET技术实践

一、设计模式与C#语言特性融合 C#凭借其面向对象特性、泛型、委托/事件、LINQ等能力&#xff0c;为设计模式提供了更优雅的实现方式。以下通过典型模式展现其技术融合&#xff1a; 1. 工厂方法模式 泛型约束 public interface IProduct<T> where T : new() {void O…...

原子性(Atomicity)和一致性(Consistency)的区别?

原子性&#xff08;Atomicity&#xff09;和一致性&#xff08;Consistency&#xff09;是数据库事务ACID特性中的两个核心概念&#xff0c;虽然它们密切相关&#xff0c;但解决的问题和侧重点完全不同。原子性关注事务的操作完整性&#xff0c;而一致性关注数据的逻辑正确性。…...

windows设置暂停更新时长

windows设置暂停更新时长 win11与win10修改注册表操作一致 &#xff0c;系统界面不同 1.打开注册表 2.在以下路径 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键新建 DWORD 32位值&#xff0c;名称为FlightSettingsMaxPauseDays 根据需求填写数…...

【Kimi】自动生成PPT-并支持下载和在线编辑--全部免费

【Kimi】免费生成PPT并免费下载 用了好几个大模型&#xff0c;有些能生成PPT内容&#xff1b; 有些能生成PPT&#xff0c;但下载需要付费&#xff1b; 目前只有Kimi生成的PPT&#xff0c;能选择模板、能在线编辑、能下载&#xff0c;关键全部免费&#xff01; 一、用kimi生成PP…...

一款在手机上制作电子表格

今天给大家分享一款在手机上制作电子表格的&#xff0c;免费好用的Exce1表格软件&#xff0c;让工作变得更加简单。 1 软件介绍 Exce1是一款手机制作表格的办公软件&#xff0c;您可以使用手机exce1在线制作表格、工资表、编辑xlsx和xls表格文件等&#xff0c;还可以学习使用…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.1单节点安装(Docker与手动部署)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 10分钟快速部署Elasticsearch单节点环境1. 系统环境要求1.1 硬件配置推荐1.2 软件依赖 2. Docker部署方案2.1 部署流程2.2 参数说明2.3 性能优化建议 3. 手动部署方案3.1 安…...

7 天精通 DeepSeek 实操手册

挑战目标 从零基础开始&#xff0c;用 7 天时间&#xff0c;精通 DeepSeek 实操。 对零基础的同学来说&#xff0c;要全部完成这个挑战并不容易。因此&#xff0c;我们提供了每天的学习目标和实操任务&#xff0c;并提供三大锦囊助你一臂之力&#xff1a; 针对常见问题的解决…...

过滤器 二、过滤器详解

过滤器生命周期&#xff1a; init(FilterConfig)&#xff1a;在服务器启动时会创建Filter实例&#xff0c;并且每个类型的Filter只创建一个实例&#xff0c;从此不再创建&#xff01;在创建完Filter实例后&#xff0c;会马上调用init()方法完成初始化工作&#xff0c;这个方法…...

【Mac电脑本地部署Deepseek-r1:详细教程与Openwebui配置指南】

文章目录 前言电脑配置&#xff1a;安装的Deepseek版本&#xff1a;使用的UI框架&#xff1a;体验效果展示&#xff1a;本地部署体验总结 部署过程Ollama部署拉取模型运行模型Openwebui部署运行Ollama服务在Openwebui中配置ollama的服务 后话 前言 deepseek最近火的一塌糊涂&a…...

网络安全学习中,web渗透的测试流程是怎样的?

渗透测试是什么&#xff1f;网络安全学习中&#xff0c;web渗透的测试流程是怎样的&#xff1f; 渗透测试就是利用我们所掌握的渗透知识&#xff0c;对网站进行一步一步的渗透&#xff0c;发现其中存在的漏洞和隐藏的风险&#xff0c;然后撰写一篇测试报告&#xff0c;提供给我…...

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹&#xff0c;用于放置调试文件以及你未来写的代码&#xff0c;随便命名但…...

【MySQL篇】表的操作

1&#xff0c;创建表 语法&#xff1a; create table ( field1 datatype, field2 datatype, field3 datatype )charset 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1a; field表示列名datatype表示列的类型charset字符集&#xff0c;如果没有指明&#xff0c;则…...

第6_7章_管理权限评估和测试策略

管理权限 权限将受保护的对象与必须评估以决定是否应授予访问权限的策略相关联。 在创建要保护的资源以及要用于保护这些资源的策略后&#xff0c; 您可以开始管理权限。要管理权限&#xff0c;请在编辑资源服务器时单击 Permissions 选项卡。 可以创建权限来保护两种主要类…...

2025年网校系统源码开发趋势:技术革新的教育培训APP搭建实战

2025年&#xff0c;随着AI、大数据、云计算等技术的深度融合&#xff0c;网校教育系统的源码开发也迎来了新的发展趋势。本文将深入探讨这些趋势&#xff0c;并结合教育培训APP的开发实战&#xff0c;展示如何应对未来的技术挑战。 一、2025年网校教育系统源码的技术趋势 AI驱…...

Linux驱动开发实战(一):LED控制驱动详解

Linux驱动开发野火实战&#xff08;一&#xff09;&#xff1a;LED控制驱动详解 文章目录 Linux驱动开发野火实战&#xff08;一&#xff09;&#xff1a;LED控制驱动详解引言一、基础知识1.1 什么是字符设备驱动1.2 重要的数据结构read 函数write 函数open 函数release 函数 二…...

PowerShell 执行策略:fnm管理软件安装nodejs无法运行npm,错误信息:about_Execution_Policies

通过fnm管理软件安装NodeJS后添加环境变量依然无法执行npm,提示无法加载文件&#xff0c;错误如下&#xff1a; PowerShell 执行策略简介&#xff1a; PowerShell 执行策略是一项安全功能&#xff0c;用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶…...

论文阅读笔记:Deep Face Recognition: A Survey

论文阅读笔记&#xff1a;Deep Face Recognition: A Survey 1 介绍2 总览2.1 人脸识别组件2.1.1 人脸处理2.1.2 深度特征提取2.1.3 基于深度特征的人脸对比 3 网络结构和损失函数3.1 判别损失函数的演化3.1.1 基于欧式距离的损失3.1.2 基于角度/余弦边距的损失3.1.3 Softmax损失…...

本地dify绑定notion

需要用到 notion 的“集成”功能。对于个人用户来说&#xff0c;选择使用**内部 internal **集成&#xff0c;公司用户可以考虑使用公开 public 集成。 在下面的 notion 集成网站中申请一个新的集成&#xff1a; Notion – The all-in-one workspace for your notes, tasks, …...

k8s中pod的调度策略之pod的亲和性调度与反亲和性调度 一文搞懂 k8s中创建的pod如何调度?

接上文写的Node亲和性调度https://blog.csdn.net/soso678/article/details/144777397 Pod 间的亲和性和反亲和性&#xff08;Affinity/AntiAffinity&#xff09;调度 Pod 间亲和性与反亲和性使你可以基于已经在节点上运行的 Pod 的标签来约束 Pod 可以调度到的节点&#xff0…...

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例&#xff1a;定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…...

借DeepSeek的风思考:未来可通过AI+视觉识别技术,实现足球比赛中的教练决策指挥系统,以此提高中国足球冲出亚洲夺取世界杯冠军

国家如此强大&#xff0c;必须需要提升国足冲向世界&#xff0c;一雪前耻的了。现在我脑洞大开&#xff0c;提出以下思路寄望国家重视。具体思考如下&#xff1a; 通过AI视觉识别技术实现足球比赛中的教练决策指挥系统&#xff0c;有潜力提升中国足球的竞争力。但要实现这一目标…...

DeepSeek今日连开3源!针对优化的并行策略,梁文锋本人参与开发

DeepSeek开源周第四天&#xff0c;直接痛快「1日3连发」&#xff0c;且全都围绕一个主题&#xff1a; 优化并行策略。 DualPipe&#xff1a;一种创新的双向流水线并行算法&#xff0c;能够完全重叠前向和后向计算-通信阶段&#xff0c;并减少“流水线气泡”。它通过对称的微批…...

【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现

项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…...

蓝桥杯2024年第十五届省赛真题-传送阵

#include<stdio.h> #include<stdbool.h> #define MAX 100000 int circle[MAX];//记录每个环大小 int parent[MAX];//记录每个传送阵所属的环 int m[MAX]; bool visited[MAX]; int circleIndex0;//当前环的编号 //迭代实现换的查找void findcircle(int start){int c…...

数据存储:一文掌握存储数据到mysql的详细使用

文章目录 一、环境准备1.1 安装MySQL数据库1.2 安装Python MySQL驱动 二、连接到MySQL数据库三、执行基本的CRUD操作3.1 创建&#xff08;Create&#xff09;&#xff1a;插入数据3.2 读取&#xff08;Read&#xff09;&#xff1a;查询数据3.3 更新&#xff08;Update&#xf…...

【华为OD机考】华为OD笔试真题解析(15)--异常的打卡记录

题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据&#xff0c;也是计算职工工资的原始依据&#xff0c;为了正确地计算职工工资和监督工资基金使用情况&#xff0c;公司决定对员工的手机打卡记录进行异常排查。 如果出现以下两种情况&#xff0c;则认为打卡异常…...

Java实战:使用HttpClient实现图片下载与本地保存

在当今数字化时代&#xff0c;网络资源的获取与处理已成为软件开发中的常见需求。其中&#xff0c;图片作为网络上最常见的资源之一&#xff0c;其下载与保存功能在许多应用场景中都显得尤为重要。无论是社交媒体平台、电商平台&#xff0c;还是个人项目&#xff0c;能够高效地…...

【实战】使用PCA可视化神经网络提取后的特征空间【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

DeepSeek05-大模型WebUI

一、说明&#xff1a; 将DeepSeek部署到前台Web界面的方法主要有以下几种推荐方案&#xff0c;涵盖开源工具、第三方客户端及特定场景适配方案&#xff1a; Open WebUIChatbox AICherry StudioSillyTavern 二、Open WebUI 安装配置教程 特点&#xff1a;Open WebUI 是一个开…...

第14天:C++异常处理实战指南 - 构建安全的文件解析系统

第14天&#xff1a;C异常处理实战指南 - 构建安全的文件解析系统 一、今日学习目标 &#x1f3af; 掌握C异常处理的核心语法与流程&#x1f6e1;️ 理解RAII在资源管理中的关键作用&#x1f4e6; 创建自定义文件解析异常体系&#x1f680; 实现安全的文件解析器原型 二、C异常…...