Franky's LIFE

Anything... ...

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  53 随笔 :: 87 文章 :: 6 评论 :: 0 Trackbacks
  Proxy 代 理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些 原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时 加上一个对此对象的访问层。如下图:
   

       比如说 C A 不在一个服务器上, A 要频繁的调用 C ,我们可以在 A 上做一个代理类 Proxy ,把访问 C 的工作交给 Proxy ,这样对于 A 来说,就好像在直接访问 C 的对象。在对 A 的开发中我们可以把注意力完全放在业务的实现上。

       GoF 《设计模式》中说道:为其他对象提供一种代理以控制这个对象的访问。

       Proxy 模式的结构:
   

       下面通过一个场景来看看 Proxy 的实现,我们要使用代理类型 ProxyClass 的对象调用远程机器上的一个类型 LongDistanceClass 的对象。

    首先我们先模拟一个远程的类型:为了保持对被代理对象使用的透明性,我们使代理类型和被代理类型同时继承同一个接口IProxy

    接口实现:

    interface IProxy

    {

        string Function1();

        string Function2();

    }

    远程对象实现:

    /// <summary>

    /// 模拟的远程对象

    /// </summary>

    public class LongDistanceClass:IProxy

    {

        #region IProxy 成员

        public string Function1()

        {

            //do someting

            return "LongDistanceClass.Function1";

        }

        public string Function2()

        {

            //do someting

            return "LongDistanceClass.Function2";

        }

        #endregion

    }

    接下来就要实现代理类型,使用代理对象访问模拟的远程对象,代理类型实现如下:

    public class ProxyClass:IProxy

    {

        #region IProxy 成员

        public string Function1()

        {

            //to access LongDistanceClass.Function1

            LongDistanceClass obj = new LongDistanceClass();

            return obj.Function1();

        }

        public string Function2()

        {

            //to access LongDistanceClass.Function2

            LongDistanceClass obj = new LongDistanceClass();

            return obj.Function2();

        }

        #endregion

    }

 

    最后实现客户端代码:

    class Class1

    {

        [STAThread]

        static void Main(string[] args)

        {

            IProxy pro = new ProxyClass();

            Console.WriteLine(pro.Function1());

            Console.WriteLine(pro.Function2());

            Console.Read();

        }

    }

    运行结果如下:

    LongDistanceClass.Function1

LongDistanceClass.Function2

       Proxy 模式的要点:

       1 、“增加一层间接层”是软件系统中对许多负责问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的 proxy 对象便是解决这一问题的常用手段。

       在我们日常的工作中也常常用到代理模式,比如对于三层结构或者 N- tiers 结构中 DAL 数据访问层,它把对数据库的访问进行封装。 BLL 业务层的开发者只是调用 DAL 中的方法来获得数据。

       在比如前一段时间看了看 AOP Remoting 方面的资料,对于跨越应用程序域的访问,要为客户应用程序提供一个 TransparentProxy (透明代理),客户程序实际上是通过访问这个代理来访问实际的类型对象。

2 、具体 proxy 设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象作细粒度的控制,有些可能对组件模块提供抽象代理层,在架构层次对对象作 proxy

3 proxy 并不一定要求保持接口的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。例如上面的那个例子,代理类型 ProxyClass 和被代理类型 LongDistanceClass 可以不用继承自同一个接口,正像 GoF 《设计模式》中说的:为其他对象提供一种代理以控制这个对象的访问。代理类型从某种角度上讲也可以起到控制被代理类型的访问的作用。

posted on 2007-03-19 21:01 Franky 阅读(169) 评论(0)  编辑  收藏 所属分类: IT知识

只有注册用户登录后才能发表评论。


网站导航: