一、设计模式与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自动生成模式代码
掌握模式本质而非具体实现形式,方能在复杂系统设计中游刃有余。
参考文献
- 《设计模式:可复用面向对象软件的基础》GoF
- 《C# in Depth》Jon Skeet
- .NET官方文档:Dependency Injection in ASP.NET Core
- gRPC官方文档:C# Quick Start Guide