风动破

导航

设计模式之代理proxy

http://blog.csdn.net/lovelion/article/details/8228042
http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/04/2576865.html
(1) 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,
也可是在另一台主机中,远程代理又称为大使(Ambassador)。
(2) 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
(3) 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
(4) 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
(5) 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。
代理模式包含如下三个角色:
(1) Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,
这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
(2) Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;
在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;
代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。
通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
(3) RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,
客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。
什么时候使用代理模式
  当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。例如:如果构建一个对象很耗费时间和计算机资源,
代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。一个代理(Proxy)通常包含和将要使用的对象同样的方法,
一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。
 一些可以使用代理模式(Proxy)的情况:
  一个对象,比如一幅很大的图像,需要载入的时间很长。 
  一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果
  一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期
  一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限
  代理模式(Proxy)也可以被用来区别一个对象实例的请求和实际的访问,例如:在程序初始化过程中可能建立多个对象,但并不都是马上使用,
代理模式(Proxy)可以载入需要的真正的对象。这是一个需要载入和显示一幅很大的图像的程序,当程序启动时,就必须确定要显示的图像,
但是实际的图像只能在完全载入后才可以显示!这时我们就可以使用代理模式(Proxy)。 

 

//定义了接口

    interface SaleTowelIntertace
    {
        void sellTowel();
    }
    //毛巾的生产类
    class TowelProduce : SaleTowelIntertace
    {
        string ConsumerName;
        public TowelProduce(string consumer_name)
        {
            ConsumerName = consumer_name;
        }
        public void sellTowel()
        {
            Console.WriteLine("毛巾卖给了{0}", ConsumerName);
        }
    }
    //卖毛巾的代理类
    class TowelSaleProxy : SaleTowelIntertace
    {
        TowelProduce tp;
        TowelSaleProxy(string consumner_name)
        {
            tp = new TowelProduce(consumner_name);
        }
        void sellTowel()
        {
            tp.sellTowel();
        }
    }

posted on 2015-05-04 10:01  风动破  阅读(128)  评论(0)    收藏  举报