Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。如下图:
比如说C和A不在一个服务器上,A要频繁的调用C,我们可以在A上做一个代理类Proxy,把访问C的工作交给Proxy,这样对于A来说,就好像在直接访问C的对象。在对A的开发中我们可以把注意力完全放在业务的实现上。
GoF《设计模式》中说道:为其他对象提供一种代理以控制这个对象的访问。
Proxy模式的结构:
下面通过一个场景来看看Proxy的实现,我们要使用代理类型ProxyClass的对象调用远程机器上的一个类型LongDistanceClass的对象。
首先我们先模拟一个远程的类型:为了保持对被代理对象使用的透明性,我们使代理类型和被代理类型同时继承同一个接口IProxy
接口实现:
interfaceIProxy
{
stringFunction1();
stringFunction2();
}
远程对象实现:
///<summary>
///模拟的远程对象
///</summary>
publicclassLongDistanceClass:IProxy
{
#regionIProxy成员
publicstringFunction1()
{
//do someting
return"LongDistanceClass.Function1";
}
publicstringFunction2()
{
//do someting
return"LongDistanceClass.Function2";
}
#endregion
}
接下来就要实现代理类型,使用代理对象访问模拟的远程对象,代理类型实现如下:
publicclassProxyClass:IProxy
{
#regionIProxy成员
publicstringFunction1()
{
//to access LongDistanceClass.Function1
LongDistanceClass obj =newLongDistanceClass();
returnobj.Function1();
}
publicstringFunction2()
{
//to access LongDistanceClass.Function2
LongDistanceClass obj =newLongDistanceClass();
returnobj.Function2();
}
#endregion
}
最后实现客户端代码:
classClass1
{
[STAThread]
staticvoidMain(string[] args)
{
IProxy pro =newProxyClass();
Console.WriteLine(pro.Function1());
Console.WriteLine(pro.Function2());
Console.Read();
}
}
运行结果如下:
LongDistanceClass.Function1
LongDistanceClass.Function2
Proxy模式的要点:
1、“增加一层间接层”是软件系统中对许多负责问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。
在我们日常的工作中也常常用到代理模式,比如对于三层结构或者N-tiers结构中DAL数据访问层,它把对数据库的访问进行封装。BLL业务层的开发者只是调用DAL中的方法来获得数据。
在比如前一段时间看了看AOP和Remoting方面的资料,对于跨越应用程序域的访问,要为客户应用程序提供一个TransparentProxy(透明代理),客户程序实际上是通过访问这个代理来访问实际的类型对象。
2、具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象作细粒度的控制,有些可能对组件模块提供抽象代理层,在架构层次对对象作proxy。
3、proxy并不一定要求保持接口的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。例如上面的那个例子,代理类型ProxyClass和被代理类型LongDistanceClass可以不用继承自同一个接口,正像GoF《设计模式》中说的:为其他对象提供一种代理以控制这个对象的访问。代理类型从某种角度上讲也可以起到控制被代理类型的访问的作用。
转自:http://www.cnblogs.com/kid-li/archive/2006/10/18/532192.html
相关推荐
设计模式C++学习之代理模式(Proxy)
Android设计模式之代理模式(Proxy Pattern)
代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式。 所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、内存中的大对象、文件或其它昂贵或无法复制的资源。 著名...
C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式)
C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) (Level 300)
详解设计模式中的proxy代理模式及在Java程序中的实现共14页.pdf.zip
12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter ...
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
C++设计模式课件15_Proxy_代理模式.pdf
为其他对象提供一个代理以控制对这个对象的访问。
设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...
代码仅供参考学习 。
Proxy 模式学习代码,包括静态代理,动态代理,cglib等
4.7 PROXY(代理)——对象结构型模式 4.8 结构型模式的讨论 第五章 行为模式 5.1 CHAIN OF RESPONSIBIL ITY(职责链)——对象行为型模式 5.2 COMMAND(命令)——对象行为型模式 5.3 INTERPRETER(解释器)——类...
安卓Android源码——TorProxy和Shadow开源项目.zip
JAVA Proxy 代理模式
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
NULL 博文链接:https://wy649898543.iteye.com/blog/1431997
Proxy代理模式的经典实例(很有面向对象思想哦)。快速学会Proxy代理模式.