索引

别名

  • Surrogate

意图

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

Provide a surrogate or placeholder for another object to control access to it.

结构

运行时一种可能的 Proxy 结构的对象图:

参与者

Proxy

  • 保存一个引用使得代理可以访问实体。若 RealSubject 和 Subject 的接口相同,Proxy 会引用 Subject。
  • 提供一个与 Subject 的接口相同的接口,这样 Proxy 就可以用来代替实体。
  • 控制对实体的存取,并可能负责创建和删除它。
  • 其他功能依赖于 Proxy 的类型:
    • 远程代理(Remote Proxy)负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
    • 虚拟代理(Virtual Proxy)可以缓存实体的附加信息,以便延迟对它的访问。
    • 保护代理(Protection Proxy)检查调用者是否具有实现一个请求所必须的访问权限。

Subject

  • 定义 RealSubject 和 Proxy 的共用接口,这样就在任何使用 RealSubject 的地方都可以使用 Proxy。

RealSubject

  • 定义 Proxy 所代表的实体。

适用性

下面是一些使用 Proxy 模式的常见情况:

  • 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
  • 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。
  • 保护代理(Protection Proxy)控制对原始对象的访问。
  • 智能代理(Smart Proxy)在访问对象时执行一些附件操作。

效果

  • Proxy 模式在访问对象时引入了一定程度的间接性。
  • Proxy 模式可以对用户隐藏 Copy-On-Write 优化方式。用 Proxy 延迟对象拷贝过程,仅当这个对象被修改时才进行真正的拷贝,用以大幅度降低拷贝大实体的开销。

相关模式

  • Adapter 为它所适配的对象提供了一个不同的接口。Proxy 提供了与它的实体相同的接口
  • Decorator 的实现与 Proxy 相似,但目的不一样。 Decorator 为对象添加功能,Proxy 则控制对对象的访问。

实现

实现方式(一):使用相同 Subject 接口实现 Proxy。

对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。

 namespace ProxyPattern.Implementation1
{
public abstract class Subject
{
public abstract string Name { get; }
public abstract void Request();
} public class ConcreteSubject : Subject
{
private string _name; public ConcreteSubject(string name)
{
_name = name;
} public override string Name { get { return _name; } } public override void Request()
{
// do something
}
} public class Proxy : Subject
{
private Subject _realSubject = null;
private string _name; public Proxy(string name)
{
_name = name;
} public override string Name { get { return _name; } } public override void Request()
{
if (_realSubject == null)
LoadRealSubject(); _realSubject.Request();
} private void LoadRealSubject()
{
// do some heavy things
_realSubject = new ConcreteSubject(_name);
}
} public class Client
{
public void TestCase1()
{
Subject subject = new Proxy("SubjectName");
var subjectName = subject.Name;
subject.Request();
}
}
}

设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

设计模式之美:Proxy(代理)的更多相关文章

  1. 设计模式12: Proxy 代理模式(结构型模式)

    Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信, ...

  2. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

  3. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

  4. php设计模式之Proxy(代理模式)和Facade(外观)设计模式

    Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...

  5. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

  6. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  7. 设计模式的征途—13.代理(Proxy)模式

    所谓代购,简单说来就是找人帮忙购买所需要的商品.代购分为两种类型,一种是因为在当地买不到某件商品,又或者是因为当地这件商品的价格比其他地区的贵,因此托人在其他地区甚至国外购买该商品,然后通过快递发货或 ...

  8. 设计模式——proxy代理模式

    目录 概述 定义 角色 为什么会有代理模式? 应用场景 示例 静态代理 例子 动态代理 JDK中生成代理对象的API 代码示例: 代码示例2 Cglib代理 代码示例 AOP(AspectOrient ...

  9. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

随机推荐

  1. 登陆mysql时出现unknown variable 'character_set_client=UTF8' 的错误

    今天,登陆数据库服务器的时候,出现了下面的错误: [root@localhost app]# mysql -uroot -p mysql: unknown variable 'character-se ...

  2. android开发 如何调用SO

    java package com.example.callsodemo; import android.R.integer; import android.R.string; import andro ...

  3. ubuntu 14 配置JDK

    1. 下载JDK http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html 下载后的保存地址: /home/root1 ...

  4. iframe自动适应高度

    iframe代码,注意要写ID <iframe src="test.html" id="main" width="700" heigh ...

  5. python中的system函数与编码

    在调用os.system执行命令时,发现system不能接受unicode的命令.那么命令中却又包含以unicode表示的中文等字符怎么办? ——方法就是将unicode转化为utf8 path = ...

  6. hdu 3661 Assignments (贪心)

    Assignments Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. 如何将PHP对象数组转换成普通数组

    /** * 对象数组转为普通数组 * * AJAX提交到后台的JSON字串经decode解码后为一个对象数组, * 为此必须转为普通数组后才能进行后续处理, * 此函数支持多维数组处理. * * @p ...

  8. Selenium2+python自动化16-alert\confirm\prompt

    前言 不是所有的弹出框都叫alert,在使用alert方法前,先要识别出到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决. alert\confirm\prompt ...

  9. iconv命令 gbk 转 UTF-8

    -----linux gbk 转 UTF-8-------- iconv 用法 iconv -f "gbk" -t "utf-8" < infile &g ...

  10. win7 64位 mongodb2.6.0 安装服务启动

    Workaround to install as a service You can manually install 2.6.0 as a service on Windows from an Ad ...