【设计模式】代理模式

代理模式(Proxy Pattern)

概念:

· 一种结构型设计模式;

· 为其他对象提供一种代理以控制对这个对象的访问;

· 代理可以在真实对象实现的前后进行必要的对实现的补充;

UML结构:

cs 复制代码
          Subject(抽象主题)
                 ^
                 |
   ------------------------------
   |                            |
RealSubject(真实主题)     Proxy(代理)
                                |
                             持有 RealSubject 引用

代码示例:

cs 复制代码
/// <summary>
/// 主题抽象类
/// </summary>
public abstract class Subject
{
    public abstract void Request();
}

/// <summary>
/// 真实主题实现类
/// </summary>
public class RealSubject : Subject
{
    public override void Request()
    {
        Console.WriteLine("真实主题:处理请求");
    }
}

/// <summary>
/// 代理类
/// </summary>
public class Proxy : Subject
{
    private RealSubject _realSubject;

    public override void Request()
    {
        if (_realSubject == null)
        {
            _realSubject = new RealSubject();
        }

        Console.WriteLine("代理:在调用真实主题之前,可以执行额外操作");
        _realSubject.Request();
        Console.WriteLine("代理:在调用真实主题之后,可以执行额外操作");
    }
}

/// <summary>
/// 客户端
/// </summary>
public class Client
{
    public static void Main()
    {
        Subject proxy = new Proxy();
        proxy.Request();
    }
}

特点:
优点:

· 控制访问:可以在不改变真实对象的情况下,控制对它的访问逻辑;

· 扩展功能:代理可以在调用前后附加功能,比如权限、日志、统计等等;

· 延迟加载:可以实现延迟加载,只有在真正需要时才创建,节省资源;

· 远程代理:客户端通过代理向本地一样调用远程对象;
缺点:

· 增加了系统的复杂度;

· 可能影响了性能;

· 滥用可能会导致代码的臃肿;

适用场景:

· 远程代理:为远程对象提供本地代理(如.NET Remoting、WebService);

· 虚拟代理:需要大量资源的对象,延迟加载(大图像、视频等等);

· 保护代理:控制不同用户对目标对象的访问权限;

· 智能指引:访问对象时提供额外服务;

举例场景:

· 延时加载

相关推荐
CDN3608 分钟前
[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑
开发语言·网络·python
froginwe1112 分钟前
jQuery 添加元素
开发语言
zhangfeng113316 分钟前
PHP 语法检查命令 php -l “$file“ > /dev/null 2>&1;
开发语言·php
csbysj202016 分钟前
解释器模式
开发语言
CoderCodingNo32 分钟前
【信奥业余科普】C++ 的奇妙之旅 | 20:更安全的间接访问——引用的设计动机与实战对比
开发语言·c++
知识汲取者1 小时前
巨量引擎 Marketing API Java SDK 介绍
java·开发语言
182******20831 小时前
2026年40岁自学java还能找到工作吗
java·开发语言
唐青枫1 小时前
别只会用 MemoryCache!C#.NET CacheManager 详解:多级缓存、Region 与 Redis 实战
c#·.net
yuzhiboyouye1 小时前
java线程池
java·开发语言·firefox
吴可可1232 小时前
PointF坐标精度与使用注意事项
c#