博客
关于我
C#设计模式之十二代理模式(Proxy Pattern)【结构型】
阅读量:411 次
发布时间:2019-03-06

本文共 2341 字,大约阅读时间需要 7 分钟。

代理模式(Proxy Pattern)

一、引言

今天我们将探讨软件设计模式中的最后一个结构型模式——代理模式(Proxy Pattern)。这个模式以其“代理”之名,意在通过间接层实现对目标对象的控制和管理,避免直接操作带来的复杂性。无论是明星经纪人还是操作系统中的防火墙,代理模式在现实生活中随处可见。

二、代理模式详细介绍

2.1 动机

在面向对象系统中,某些对象可能由于资源消耗大、安全需求高或需要进程外访问等原因,直接操作这些对象可能会给使用者或系统结构带来诸多麻烦。为了在不失去透明操作对象的同时控制和管理这些复杂性,增加一层间接层成为软件开发的常见解决方案。

2.2 意图

通过为其他对象提供一层代理,以控制对该对象的访问。

2.3 结构图
2.4 模式组成

代理模式涉及三个角色:

  • 抽象主题角色(Subject):声明了真实主题和代理主题的公共接口,使使用者无需关心是否使用真实主题或代理主题。
  • 代理主题角色(Proxy):内部含有对真实主题的引用,负责将客户端的调用传递给真实主题,并在需要时创建真实主题对象。代理角色通常在传递调用前或后执行额外操作。
  • 真实主题角色(RealSubject):定义了代理角色所代表的真实对象。
  • 2.5 代理模式分类

    根据使用目的,代理模式可分为以下几种:

  • 远程代理:为位于不同地址空间的对象提供局域代表,典型例子是客户端调用Web服务。
  • 虚拟代理:通过消耗资源较少的对象代表资源较大的对象,延迟对象的创建。
  • Copy-on-Write代理:虚拟代理的一种,将克隆操作拖延到客户端需要时执行。
  • 保护代理:控制对象访问,提供不同级别的使用权限。
  • 防火墙代理:保护目标不受恶意用户侵扰。
  • 智能引用代理:在引用对象时提供额外操作,如调用次数记录。
  • 缓冲代理:为操作结果提供临时存储空间,优化系统性能。
  • 2.6 代理模式实现

    以明星经纪人为例,代理模式的实现可以理解为经纪人在客户端代表明星,与经纪人打交道的全过程即为代理模式的应用。

    namespace ProxyPatternExample{    public abstract class AgentAbstract    {        public virtual void Speculation(string thing) { Console.WriteLine(thing); }    }    public sealed class FanStar : AgentAbstract    {        public override void Speculation(string thing)        {            Console.WriteLine("为了炒作,必要时可以采取以下措施:");            base.Speculation(thing);        }    }    public sealed class AgentPerson : AgentAbstract    {        private FanStar boss;        public AgentPerson()        {            boss = new FanStar();        }        public override void Speculation(string thing)        {            Console.WriteLine("经纪人会在背后安排:");            base.Speculation(thing);            Console.WriteLine("并通过合理的渠道最大化收益。");        }    }}

    三、代理模式实现要点

    • 增加一层间接层是解决复杂性问题的常见方法。在面向对象系统中,直接使用某些对象可能带来诸多问题,而间接层的Proxy对象则提供了解决方案。
    • Proxy设计的实现粒度因具体情况而异,有的做到细粒度如Copy-on-Write技术,有的做到模块层次。
    • Proxy不一定要求保持接口一致性,有时透明性可以接受一定程度的损失。
    3.1 代理模式优点
  • 降低耦合度:通过隔离调用,减少系统依赖。
  • 保护目标对象:在处理请求前后可执行额外操作,如权限检查。
  • 不同类型代理有独特优点
    • 远程代理:优化远程访问性能。
    • 虚拟代理:节省资源消耗。
    • 缓冲代理:优化性能,缩短执行时间。
    • 保护代理:灵活控制访问权限。
  • 3.2 代理模式缺点
  • 性能影响:增加一层间接层可能导致请求处理速度变慢。
  • 实现复杂度增加:需要额外开发代理类,增加系统复杂性。
  • 3.3 代理模式使用场景

    根据不同的需求选择适合的代理类型:

  • 远程访问:使用远程代理。
  • 资源消耗高:使用虚拟代理。
  • 结果缓存:使用缓冲代理。
  • 访问控制:使用保护代理。
  • 额外操作:使用智能引用代理。
  • 四、.NET中的代理模式实现

    在Net中,代理模式的实现主要体现在以下几个方面:

    • WCF和Remoting:框架级代理,生成本地代理以访问进程外或机器外对象。
    • StringBuilder:作为可变字符串的代理,虽然不完全遵循接口一致性。

    五、总结

    今天我们探讨了结构型设计模式中的最后一个模式——代理模式。通过分析动机、结构、实现和典型场景,我们了解了代理模式在解决复杂性问题中的应用价值。无论是明星经纪人还是操作系统防火墙,代理模式在现实生活中随处可见。理解代理模式的核心及其适用场景,有助于在实际开发中灵活应用。

    从下篇文章开始,我们将进入行为型设计模式的探索之旅。

    转载地址:http://auukz.baihongyu.com/

    你可能感兴趣的文章
    ng build --aot --prod生成文件报错
    查看>>
    ng 指令的自定义、使用
    查看>>
    nghttp3使用指南
    查看>>
    Nginx
    查看>>
    nginx + etcd 动态负载均衡实践(三)—— 基于nginx-upsync-module实现
    查看>>
    nginx + etcd 动态负载均衡实践(二)—— 组件安装
    查看>>
    nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
    查看>>
    Nginx + Spring Boot 实现负载均衡
    查看>>
    Nginx + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
    查看>>
    nginx 1.24.0 安装nginx最新稳定版
    查看>>
    nginx 301 永久重定向
    查看>>
    nginx css,js合并插件,淘宝nginx合并js,css插件
    查看>>
    Nginx gateway集群和动态网关
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx log文件写入失败?log文件权限设置问题
    查看>>
    Nginx Lua install
    查看>>
    nginx net::ERR_ABORTED 403 (Forbidden)
    查看>>
    Nginx SSL私有证书自签,且反代80端口
    查看>>