您的位置:首页 > 编程语言 > C#

C#设计模式之代理模式(Proxy Pattern)

2016-10-14 18:41 344 查看
装饰模式解释: 

       为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

使用时机:
1. 远程(Remote)代理。如WebService,当程序加入一个WebService引用时,项目就会生成一个WebReference的文件夹和一些文件,它们就是代理。这就使得客户端可以通过调用代理来进远程访问。

2. 虚拟(Virtual)代理。根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。

3. 安全代理。用来控制真实对象访问时的权限,
一般用于对象应用有不同的访问权限的时候。

4.智能指引。调用真实的对象时,
代理处理另外一些事.比如记录调用次数等。

在代理模式中的各个角色有:

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
UML图:



代码实现:

创建Subject类, 定义了RealSubject和Proxy的接口
public abstract class Subject
{
public abstract void Request();
}

创建RealSubject类, 即Proxy要代理的真实实体
public class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}

创建Proxy类,
保存一个引用使得代理可以访问实体,并提供一个与Subject接口相同的接口, 这样代理就可以替代实现.

public class Proxy : Subject
{
RealSubject realSubject;
public override void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}

客户端调用

<span style="font-size:14px;">Static void Main()
{
Proxy proxy =  new Proxy();
proxy.Request();
}</span>


代理模式(Proxy)VS 裝饰模式(Decorator)
意图:它们都提供间接访问对象层,都保存被调用对象的引用。

代理模式(Proxy):为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。

装饰者(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式比生成子类更为灵活,它避免了类爆炸问题,像装饰者(Decorator),代理模式(Proxy)组成一个对象并提供相同的接口,但代理模式并不关心对象动态职能的增减。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息