1、结构图
2、代码
/************************************************************************
* 意图:为其他对象提供一种代理以控制对这个对象的访问。
*
* 适用性:
* 1、在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。
* 下面是一 些可以使用P r o x y 模式常见情况:
* 1) 远程代理(Remote Proxy )为一个对象在不同的地址空间提供局部代表。
* NEXTSTEP[Add94] 使用NXProxy 类实现了这一目的。Coplien[Cop92]
* 称这种代理为“大使” (Ambassador)。
* 2 )虚代理(Virtual Proxy )根据需要创建开销很大的对象。在动机一节
* 描述的ImageProxy就是这样一种代理的例子。
* 3) 保护代理(Protection Proxy )控制对原始对象的访问。保护代理用于
* 对象应该有不同 的访问权限的时候。
* 4 )智能指引(Smart Reference )取代了简单的指针,它在访问对象时执行
* 一些附加操作。 它的典型用途包括:对指向实际对象的引用计数,这样当
* 该对象没有引用时,可以自动释放它(也称为SmartPointers[Ede92])。
* 2、当第一次引用一个持久对象时,将它装入内存。
* 3、在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
*
* 协作:
* 1、代理根据其种类,在适当的时候向RealSubject转发请求。
*
* 作者:董怀信
* 日期:2009-04-6-04
* **********************************************************************/
using System;
namespace DesignPattern.StructuralPattern
{
/// <summary>
/// 定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都
/// 可以使用Proxy。
/// </summary>
public interface Subject
{
void Request();
}
/// <summary>
/// 定义Proxy所代表的实体。
/// </summary>
public class RealSubject:Subject
{
#region Subject Members
public void Request()
{
Console.WriteLine("RealSubject:Request();");
}
#endregion
}
/// <summary>
/// 1、保持一个引用使得代理可以访问实体。若RealSubject的接口相同,Proxy会引用Subject。
/// 2、提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
/// 3、控制对实体的存取,并可能复制创建和删除它。
/// 4、其他功能依赖于代理的类型:
/// 1)Remote Proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
/// 2)Virtual Proxy可以缓存实体的附加信息,以便延迟对它的访问。
/// 3)Projection Proxy检查调用者是否具有实现一个请求所必须的访问权限。
/// </summary>
public class Proxy:Subject
{
private Subject m_realSubject;
public Proxy(Subject realSubject)
{
m_realSubject = realSubject;
}
public void Request()
{
m_realSubject.Request();
}
}
/// <summary>
/// 客户测试
/// </summary>
public class Client
{
public void Test()
{
Subject realSubject = new RealSubject();
Subject proxy = new Proxy(realSubject);
proxy.Request();
}
}
}