1. 模式定义
代理模式是一种结构型设计模式,通过创建一个代理对象来控制对原始对象的访问。代理类与原始类实现相同的接口,客户端通过代理间接操作原始对象,常用于访问控制、延迟加载、日志记录等场景。
2. 模式结构
- Subject(抽象主题): 定义真实对象和代理的公共接口。
- RealSubject(真实主题): 实际执行业务逻辑的对象。
- Proxy(代理): 持有对真实主题的引用,控制访问并增强功能。
// 抽象主题
public interface ISubject
{
void Request();
}
// 真实主题
public class RealSubject : ISubject
{
public void Request()
{
Console.WriteLine("RealSubject: Handling request.");
}
}
// 代理
public class Proxy : ISubject
{
private RealSubject _realSubject;
public void Request()
{
if (_realSubject == null)
_realSubject = new RealSubject();
PreRequest();
_realSubject.Request();
PostRequest();
}
private void PreRequest() => Console.WriteLine("Proxy: Preparing request.");
private void PostRequest() => Console.WriteLine("Proxy: Cleaning up after request.");
}
3. 代理类型及适用场景
- 虚拟代理: 延迟加载大对象(如图片、文件)。
- 保护代理: 控制访问权限(如权限验证)。
- 远程代理: 跨网络访问对象(如Web服务)。
- 日志代理: 记录操作日志。
- 缓存代理: 缓存结果提升性能。
4. .NET Core 示例:保护代理
场景描述
实现一个文件查看服务,代理类检查用户权限后允许访问敏感文件。
代码实现
步骤1:定义抽象主题和真实主题
// 文件服务接口
public interface IFileViewer
{
void ViewFile(string fileName);
}
// 真实文件服务
public class FileService : IFileViewer
{
public void ViewFile(string fileName)
{
Console.WriteLine($"Displaying file: {fileName}");
}
}
步骤2:实现保护代理
public class FileServiceProxy : IFileViewer
{
private readonly FileService _fileService;
private readonly string _userRole;
public FileServiceProxy(string userRole)
{
_fileService = new FileService();
_userRole = userRole;
}
public void ViewFile(string fileName)
{
if (CheckAccess())
_fileService.ViewFile(fileName);
else
Console.WriteLine("Access denied: Insufficient privileges.");
}
private bool CheckAccess() => _userRole == "Admin";
}
步骤3:客户端调用
class Program
{
static void Main(string[] args)
{
// 普通用户尝试访问
IFileViewer userProxy = new FileServiceProxy("User");
userProxy.ViewFile("secret.txt"); // 输出:Access denied
// 管理员访问
IFileViewer adminProxy = new FileServiceProxy("Admin");
adminProxy.ViewFile("secret.txt"); // 输出:Displaying file: secret.txt
}
}
5. 在 .NET Core 中使用依赖注入
通过依赖注入透明地使用代理。
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IFileViewer>(provider =>
new FileServiceProxy("Admin")); // 根据上下文动态设置用户角色
}
6. 代理模式 vs 装饰器模式
- 代理模式: 控制访问,通常预先确定关系。
- 装饰器模式: 动态添加功能,通过递归嵌套增强对象。
7. 优缺点分析
- 优点:
- 职责分离,符合单一职责原则。
- 保护真实对象,增强安全性。
- 灵活扩展功能(如日志、缓存)。
- 缺点:
- 可能增加系统复杂性。
- 代理调用可能引入延迟。
8. 应用场景
- 需要延迟加载资源时(如EF Core的延迟加载)。
- 添加访问控制(如ASP.NET Core中间件)。
- 记录方法执行日志或审计。
- 为远程服务提供本地代表(如gRPC客户端)。
总结
代理模式通过中间层控制对象访问,是实现系统扩展性和安全性的重要工具。在.NET Core中,结合依赖注入可优雅地集成代理,实现权限控制、缓存等横切关注点。
1459

被折叠的 条评论
为什么被折叠?



