代理模式(Proxy)

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. 代理类型及适用场景
  1. 虚拟代理: 延迟加载大对象(如图片、文件)。
  2. 保护代理: 控制访问权限(如权限验证)。
  3. 远程代理: 跨网络访问对象(如Web服务)。
  4. 日志代理: 记录操作日志。
  5. 缓存代理: 缓存结果提升性能。

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中,结合依赖注入可优雅地集成代理,实现权限控制、缓存等横切关注点。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gene Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值