引用和参考文档
http://www.cnblogs.com/zhenyulu/articles/48128.html
http://tech.ddvip.com/2009-07/1246867920125399_2.html
http://wenku.baidu.com/link?url=bC6XooGTolQwVnfTyUyAhlwTXn-wBHLojsWxXaXdJP4n8ZDPJvTaJUaO1bFrQOfN_sMrWPgHd15ijQJsAjJCTu2MINpq1aeCzwlbQoPBedq
一 代理模式(Proxy)
代理(Proxy)模式支持一个对象对另一个对象的创建和访问进行控制。代理通常是个微型的(公共)对象,代表着一个复杂得多的(私有)对象,一旦所需的条件满足,对象就被激活。
二 使用代理原因
代理的主要目的之一,是把复杂性封装起来,让客户端程序在引用上更容易,而不需要顾虑藏在身后这些复杂的逻辑。
在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
三 代理的种类
•远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。
•虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
•Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
•保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
•Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
•防火墙(Firewall)代理:保护目标,不让恶意用户接近。
•同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
•智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
•虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
•Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
•保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
•Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
•防火墙(Firewall)代理:保护目标,不让恶意用户接近。
•同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
•智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
四 举例
例子1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Proxy1
{
// Abstract "Subject"
abstract class Subject
{
abstract public void Request();
}
// "RealSubject"
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("Called real subject.Request()");
}
}
class Proxy : Subject
{
RealSubject realSubject;
public override void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();
}
PreRequest();
realSubject.Request();
PostRequest();
}
public void PreRequest()
{
Console.WriteLine("PreRequest.");
}
public void PostRequest()
{
Console.WriteLine("PostRequest.");
}
}
public class Client
{
public static void Main(string[] args)
{
Proxy p1 = new Proxy();
p1.Request();
}
}
}
运行结果:
例子2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Proxy3
{
public interface ISubject
{
String Request();
}
public class Subject
{
public String Request()
{
return "Subject request " + "Choose left door\n";
}
}
public class Proxy : ISubject
{
Subject subject;
public String Request()
{
if (subject == null)
{
Console.WriteLine("Subject inactive");
subject = new Subject();
}
Console.WriteLine("Subject active");
return "Proxy:Call to " + subject.Request();
}
}
public class ProtectionProxy : ISubject
{
//认证代理首先要求一个密码
Subject subject;
String password = "Password01";
public String Authenticate(String supplied)
{
if (supplied != password)
{
return "Protection Proxy: No access";
}
else
{
subject = new Subject();
return "Protection Proxy : Authenticated";
}
}
public String Request()
{
if (subject == null)
{
return "Protection Proxy : Authenticate first";
}
else
return "Protection Proxy: Call to " + subject.Request();
}
}
class Client
{
static void Main(string[] args)
{
Console.WriteLine("Proxy Pattern");
Proxy p1 = new Proxy();
Console.WriteLine(p1.Request());
Console.WriteLine(p1.Request());
Console.WriteLine("ProtectionProxy Pattern");
ProtectionProxy p2 = new ProtectionProxy();
Console.WriteLine(p2.Request());
Console.WriteLine(p2.Authenticate("pass"));
Console.WriteLine(p2.Request());
Console.WriteLine(p2.Authenticate("Password01"));
Console.WriteLine(p2.Request());
}
}
}
运行结果:
五 使用proxy的情景
1. 创建的代价比较高
2. 需要访问控制
3. 访问远程站点
4. 被访问时需要执行一些动作
你希望:
1. 仅在操作被请求时创建对象
2. 在对象被访问时检查或薄记工作
3. 拥有一个可以引用远程对象的本地对象
4. 在操作被请求时实施对象的访问权限验证
2. 需要访问控制
3. 访问远程站点
4. 被访问时需要执行一些动作
你希望:
1. 仅在操作被请求时创建对象
2. 在对象被访问时检查或薄记工作
3. 拥有一个可以引用远程对象的本地对象
4. 在操作被请求时实施对象的访问权限验证