C军

不玩博客了!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

  在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

  代理模式的优点:

  (1)、职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  (2)、代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
  (3)、高扩展性

  代理模式的UML图:

      

    代码示例:

namespace ConsoleApplication1
{
    abstract class Subject
    {
        public abstract void Request();
    }

    class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("真实的请求!");
        }
    }

    //代理类
    class Proxy : Subject 
    {
        RealSubject realSubject;        //用于装载真实对象
        public override void Request()
        {
            if (realSubject == null)
            {
                realSubject = new RealSubject();    //获得真实对象
            }
            realSubject.Request();      //调用真实对象的请求方法
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Proxy proxy = new Proxy();
            proxy.Request();    //输出真实的请求

            Console.ReadKey();
        }
    }  
}

  从代码来看,代理模式的思想是很简单的,难度应该在怎么灵活应用上。

namespace 代理模式
{
    class Program
    {
        static void Main(string[] args)
        {
            小夫 proxy = new 小夫();
            proxy.Hit();    //输出真实的请求

            Console.ReadKey();
        }
    }

    abstract class Subject
    {
        public abstract void Hit();
    }

    class 胖虎 : Subject
    {
        public override void Hit()
        {
            Console.WriteLine("揍大雄!");

            //Type t = this.GetType();
            //Console.WriteLine("揍大雄的人是:" + t.Name);
        }
    }

    //代理类
    class 小夫 : Subject
    {
        胖虎 realSubject;        //把胖虎放到小夫家
        public override void Hit()
        {
            if (realSubject == null)
            {
                realSubject = new 胖虎();    //胖虎来了
            }
            realSubject.Hit();      //让胖虎揍大雄
        }
    }
}

  

  典型的应用场景是,当真正的处理类不方便使用时,就可以使用代理模式。

  1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
  2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
  3. 安全代理,用来控制真实对象的访问权限,例如上面的代理类没有送巧克力,这样送巧克力的权限就没有了。
  4. 智能指引,是指当调用真实的对象时,代理处理另外一些事。
posted on 2013-03-16 22:37  逆心  阅读(376)  评论(0编辑  收藏  举报