深入浅出设计模式——代理模式(Proxy Pattern)
模式动机
在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。
模式定义
代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。
Proxy Pattern: Provide a surrogate or placeholder for another object to control access to it. 
Frequency of use: medium high
UML图
模式结构
代理模式包含如下角色:
	Subject: 抽象主题角色
	Proxy: 代理主题角色
	RealSubject: 真实主题角色
模式分析
代理模式示意结构图比较简单,一般可以简化为如下图所示,但是在现实中要复杂很多。
模式实例与解析
体系结构
Subject: 抽象主题角色 IGiveGift.cs
namespace ProxyPattern
{
interface IGiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocalate();
}
}
Proxy: 代理主题角色 Proxy.cs
namespace ProxyPattern
{
class Proxy : IGiveGift
{
Pursuit gg;
public Proxy(SchoolGirl mm)
{
gg = new Pursuit(mm);
}
public void GiveDolls()
{
gg.GiveDolls();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
public void GiveChocalate()
{
gg.GiveChocalate();
}
}
}
RealSubject: 真实主题角色 Pursuit.cs
using System; namespace ProxyPattern
{
class Pursuit : IGiveGift
{
SchoolGirl mm;
public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Console.WriteLine(mm.Name + " 送你洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(mm.Name + " 送你鲜花");
}
public void GiveChocalate()
{
Console.WriteLine(mm.Name + " 送你巧克力");
}
}
}
SchoolGirl.cs
namespace ProxyPattern
{
class SchoolGirl
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
}
Client:客户类
using System; namespace ProxyPattern
{
class Program
{
static void Main(string[] args)
{
SchoolGirl schoolGirl = new SchoolGirl();
schoolGirl.Name = "貂蝉"; Proxy proxy = new Proxy(schoolGirl);
proxy.GiveDolls();
proxy.GiveFlowers();
proxy.GiveChocalate(); Console.Read();
}
}
}
模式优缺点
代理模式的优点
	代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
	远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
	虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
	保护代理可以控制对真实对象的使用权限。
代理模式的缺点
	由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
	实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
模式适用环境
根据代理模式的使用目的,常见的代理模式有以下几种类型:
	远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)。 
	虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 
	Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
	保护(Protect or Access)代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。 
	缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
	防火墙(Firewall)代理:保护目标不让恶意用户接近。 
	同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。 
	智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。
【声明与感谢】
本文,站在许多巨人的肩膀上,借鉴和引用了许多他人拥有版权的作品或著述,在此,对前人们的贡献致谢。并同时公布引用的内容、原作者或来源(一些来源于互联网的内容本人无法追述本源,深表遗憾)。
【参考文献】
 	《设计模式—可复用面向对象软件的基础》作者: [美] Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 / 刘建中 等 机械工业出版社
 	《重构—改善既有代码的设计》作者: Martin Fowler译者:候捷 中国电力出版社
 	《敏捷软件开发—原则、模式与实践》作者: Robert C. Martin 清华大学出版社
 	《程序员修炼之道—从小工到专家》作者: Andrew Hunt / David Thomas 电子工业出版社
 	《Head First 设计模式》作者: 弗里曼 译者: O'Reilly Taiwan公司 中国电力出版社
 	《设计模式之禅》 作者: 秦小波 机械工业出版社
 	MSDN WebCast 《C#面向对象设计模式纵横谈》 讲师:李建忠
 	刘伟. 设计模式. 北京:清华大学出版社, 2011.
 	刘伟. 设计模式实训教程. 北京:清华大学出版社, 2012.
 	《大话设计模式》 作者: 程杰 清华大学出版社
 	《C#图解教程》作者: 索利斯 译者: 苏林 / 朱晔 人民邮电出版社
 	《你必须知道的.NET》作者: 王涛
 	《项目中的.NET》作者: 李天平 电子工业出版社
 	《Microsoft .NET企业级应用架构设计》作者: (美)埃斯波西托等编著 译者: 陈黎夫
 	http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
 	http://www.cnblogs.com/zhenyulu 博客作者:吕震宇
 	http://www.cnblogs.com/terrylee 博客作者:李会军
 	http://www.cnblogs.com/anlyren/ 博客作者:anlyren
 	http://www.cnblogs.com/idior 博客作者:idior
 	http://www.cnblogs.com/allenlooplee 博客作者:Allen lee
 	http://blog.csdn.net/ai92 博客作者:ai92
 	http://www.cnblogs.com/umlonline/ 博客作者:张传波
 	http://www.cnblogs.com/lovecherry/ 博客作者:LoveCherry
深入浅出设计模式——代理模式(Proxy Pattern)的更多相关文章
- 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
		
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
 - 设计模式——代理模式(Proxy Pattern)
		
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
 - C#设计模式——代理模式(Proxy Pattern)
		
一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ...
 - 设计模式 -- 代理模式 (Proxy Pattern)
		
定义: 为其他对象提供一种代理以控制对这个对象的访问: 角色: 1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类): 2,具体实现的主题类,继承或者实现抽象主题类 ...
 - 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
		
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
 - 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
		
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
 - 二十四种设计模式:代理模式(Proxy Pattern)
		
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
 - 代理模式(Proxy pattern)
		
代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...
 - 13.代理模式(Proxy Pattern)
		
using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...
 
随机推荐
- 故障处理-ORA-00376/ORA-01110
			
数据库实例启动之后发现,9号数据文件发生故障,file 9 cannot be read at this time, ORACLE Instance ilndb2 (pid = 16) - Error ...
 - 孟加拉央行SWIFT攻击事件恶意木马分析(转)
			
第一章 分析概述 该恶意木马样本为运行于winodws平台上的PE文件(名称:evtdiag.exe).文件大小为64KB,编译时间是2016年2月5日. 经分析,该样本为定制的攻击SWIFT客户端程 ...
 - Android 自定义RecyclerView 实现真正的Gallery效果
			
http://blog.csdn.net/lmj623565791/article/details/38173061
 - [PCL]FPFH描述子
			
fpfh_est.setSearchSurface(data); 如果没有设置SearchSurface,使用input数据集作为查找的表面 // If no search surface has b ...
 - 查看ADOP会话
			
查看ADOP有哪些会话: $ adop -status Enter the APPS username: apps Enter the APPS password: Current Patching ...
 - 20145320 《Java程序设计》第七周学习总结
			
20145320 <Java程序设计>第七周学习总结 教材学习内容总结 13章 时间与日期 时间的度量: 格林威治标准时间(GMT时间),现已不作为标准时间使用. 世界时(UT),秒的单位 ...
 - SQL注入POC
			
mysql #encoding=utf-8 import httplib import time import string import sys import random import urlli ...
 - 0512 Scrum 4.0
			
看板设计 每日例会时间定于下午放学回到宿舍,地点是在宿舍外的走廊或宿舍里,特殊情况待定: 团队开会照片 任务认领: 首页设计-------王俊杰 鸡汤版面-------列志华 论“汤”版面------ ...
 - 11. 星际争霸之php设计模式--备忘模式
			
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
 - 推荐使用Wiz笔记发表博客
			
一直用Wiz笔记,平时随手记录一些东西,可以自动在多台电脑同步,还支持移动客户端,上下班路上用手机也能看.最近在整理之前工作的一些资料,并把自己觉得可以分享的内容发到博客园上.当然会先在Wiz笔记上编 ...