意图

  代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

适用性

1.在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用P r o x y 模式。下面是一 些可以使用P r o x y 模式常见情况:
  1) 远程代理(Remote Proxy )为一个对象在不同的地址空间提供局部代表。 NEXTSTEP[Add94] 使用N X P r o x y 类实现了这一目的。Coplien[Cop92] 称这种代理为“大使” (A m b a s s a d o r )。
  2 )虚代理(Virtual Proxy )根据需要创建开销很大的对象。在动机一节描述的I m a g e P r o x y 就是这样一种代理的例子。
  3) 保护代理(Protection Proxy )控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。例如,在C h o i c e s 操作系统[ C I R M 9 3 ]中K e m e l P r o x i e s 为操作系统对象提供 了访问保护。

2.对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为S m a r tP o i n t e r s[ E d e 9 2 ] )。当第一次引用一个持久对象时,将它装入内存。

3.在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

结构图

Code

 1 // Factory Method 2  3 /* Notes: 4  * When there is a large CPU/memory expense attached to handling an object 5  * directly, it can be useful to use a lightweight proxy in front of it,  6  * which can take its place until the real object is needed.  7 */ 8  9 namespace Proxy_DesignPattern10 {11 using System;12 using System.Threading;13 14 /// <summary>15 ///    Summary description for Client.16 /// </summary>17 abstract class CommonSubject 18 {19 abstract public void Request(); 20 }21 22 class ActualSubject : CommonSubject23 {24 public ActualSubject()25 {26 // Assume constructor here does some operation that takes quite a27 // while - hence the need for a proxy - to delay incurring this 28 // delay until (and if) the actual subject is needed29 Console.WriteLine("Starting to construct ActualSubject"); 30 Thread.Sleep(1000); // represents lots of processing! 31 Console.WriteLine("Finished constructing ActualSubject");32 }33 34 override public void Request()35 {36 Console.WriteLine("Executing request in ActualSubject");37 }38 }39 40 class Proxy : CommonSubject41 {42 ActualSubject actualSubject;43 44 override public void Request()45 {46 if (actualSubject == null)47 actualSubject = new ActualSubject();48 actualSubject.Request();49 } 50 51 }52 53 public class Client54 {55 public static int Main(string[] args)56 {57 Proxy p = new Proxy();58 59 // Perform actions here60 // . . . 61 62 if (1==1) // at some later point, based on a condition, 63 p.Request();// we determine if we need to use subject64 65 return 0;66 }67 }68 }

转载于:https://www.cnblogs.com/sunjinpeng/archive/2012/04/07/2435827.html

设计模式 代理模式(Proxy Pattern)相关推荐

  1. 设计模式-代理模式(Proxy Pattern)

    设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...

  2. 设计模式——代理模式(Proxy Pattern)之为别人做嫁衣

    代理模式Proxy Pattern 代理模式 1.背景 2.定义 3.特征 4.应用场景 5.实验案例 参考 代理模式 1.背景 假如说我现在想租一间房子,虽然我可以自己去找房源,做卫生检测等一系列的 ...

  3. Java24种设计模式(第二种)--代理模式(Proxy Pattern)

    Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...

  4. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...

  5. js设计模式——代理模式proxy

    什么是代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. (可以想象一下明星与经纪人的关系,明星是请求的本体,经纪人就是代理proxy) 如何实现代理模式 代理对象内部含有对本 ...

  6. 设计模式(结构型)之代理模式(Proxy Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  7. JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern

    私有化构造函数的类可以提供相应的 "接口"(一般就是静态方法)来返回自己的唯一实例供外部调用,像这样的确保只生成一个实例的模式被称作单例模式. 工厂模式,一个模型,用来大规模的生产 ...

  8. 代理模式(Proxy Pattern)

    设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) C#设计模式(13)-Proxy Pattern 一. 代理(Proxy)模式 代理(Proxy)模式给某一个对 ...

  9. C++设计模式--代理模式(Proxy)

    前言 C++相对其他编程语言来说算是比较难的了,相关知识点非常多,并且有些概念理解起来比较困难,对于初学者来说可能会感觉到非常痛苦.随着项目难度的升级,需要不断地优化框架从而使整个结构更具有扩展性,那 ...

  10. 趣谈设计模式 | 代理模式(Proxy):利用代理来控制对象的访问

    文章目录 案例:房屋中介 代理模式 代理模式与装饰器模式 代理模式的应用 远程代理 虚拟代理 安全代理 智能引用代理 写时拷贝代理 总结 完整代码与文档 由于代理模式相较于前面的其他设计模式来说更加简 ...

最新文章

  1. hdu4862 费用流(不错)
  2. 【解决方案】Basemap安装出现的错误(Python)
  3. 三台机器搭建MySQL一主二从
  4. php查看表创建结构,MySQL 查看表结构简单命令
  5. oracle服务器内存建议,Oracle内存分配建议
  6. struts2实现文件查看、下载
  7. PyMOTW-3 (Python 3 Module of the Week) 翻译团队召集
  8. 出道25年,那些乘风破浪的编程语言们
  9. 网易如何做新闻推荐:深度学习排序系统及模型
  10. 保存页面的滚动条的位置
  11. 程序员需要学些什么?程序员好考吗?
  12. Qt 实现控件抖动 动画窗口抖动 QQ抖动
  13. CAD绘图设计效率慢?这些外挂神器帮你1小时完成3小时的工作!
  14. 8位数码管静态显示c语言,数码管静态显示介绍_8位数码管静态显示程序解析
  15. java材质转基岩版_我的世界java版材质包转换导入基岩版教程
  16. FusionAccess桌面云
  17. uni.showToast appd端不起作用
  18. php fpm配置和php.ini,php安装完后配置php.ini和php-fpm.conf
  19. python 日期API
  20. 王曦:大数据人工智能中的运筹与决策科学

热门文章

  1. 把博客园自己博客皮肤改了下
  2. Spring Boot 系列(七)Swagger2-生成RESTful接口文档
  3. [转]Google 发现的十大真理
  4. DECLARE_DYNAMIC IMPLEMENT_DYNAMIC
  5. 怎么去掉字符串最后一个逗号
  6. POJ 2773 Happy 2006 【数论,容斥原理+二分】
  7. 模板 n维矩阵的二分幂
  8. 学习C++必须掌握的概念
  9. Android------Button 添加声音效果(两种方式)
  10. Win10 家庭版找不到 gpedit.msc;win10怎样关闭windows defender