博客
关于我
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/

    你可能感兴趣的文章
    nginx 常用指令配置总结
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 结合 consul 实现动态负载均衡
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置清单(一篇够用)
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+php的搭建
    查看>>
    nginx+tomcat+memcached
    查看>>
    nginx+Tomcat性能监控
    查看>>
    nginx+uwsgi+django
    查看>>
    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
    查看>>