结构型模式之七---Proxy

1、结构图

 

Proxy结构图

 

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();

        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalsonTung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值