设计模式学习笔记(十三)——Proxy代理模式

转载 2007年09月18日 16:59:00
设计模式学习笔记(十三)——Proxy代理模式

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

       比如说CA不在一个服务器上,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中的方法来获得数据。

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

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

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

 

设计模式:代理模式(Proxy)

代理模式:为其他对象提供一种代理以控制对这个对象的访问。 代理模式中的角色: 抽象主题角色(Subject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对...
  • u013256816
  • u013256816
  • 2016年03月29日 21:38
  • 4379

设计模式(结构型)之代理模式(Proxy Pattern)

代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式...
  • yanbober
  • yanbober
  • 2015年05月04日 18:48
  • 5694

设计模式总结之Proxy Pattern(代理模式)

为其他对象提供一种代理以控制对这个对象的访问。
  • cooldragon
  • cooldragon
  • 2016年08月11日 00:50
  • 1244

设计模式中代理(proxy)与委托(delegate)的语义区别

2014年10月17日 05:39:19      今天经浩哥与柏哥的解释,自己终于掌握了proxy与delegete语义的区别:      proxy :译为代理, 被代理方(B)与代理方(A)...
  • jince007
  • jince007
  • 2014年10月17日 06:50
  • 2229

最常用的设计模式---代理模式(C++实现)

代理模式:为其他对象提供一种代理以控制对这个对象的访问
  • lh844386434
  • lh844386434
  • 2014年01月09日 17:23
  • 2052

设计模式(十三)——代理模式(Proxy)

一、理解:     代理模式,用于为其他对象提供一种代理以控制对该对象的访问。     为什么不直接使用某个对象,却要“画蛇添足”的在外部增加一层,间接对其进行访问?考虑下面的一些情况: 1、某...
  • zyy5411
  • zyy5411
  • 2012年12月19日 17:35
  • 745

Java设计模式——代理模式实现及原理

简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术。生活中的方方面面都可以虚拟到代码中。代理模式所讲的就是现实生活中的这么一个概念:中介。 代理模式的定义:给某一个对象提...
  • Goskalrie
  • Goskalrie
  • 2016年09月07日 13:43
  • 21300

【设计模式】使用unity实现代理模式(Proxy mode)

阅读《大话设计模式》后,自己根据unity的特性写的一个简单demo,如有不妥之处,欢迎评论纠正.... 先贴上书中的代码: using System; using System.Collecti...
  • qq_28221881
  • qq_28221881
  • 2017年03月28日 22:31
  • 659

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对...
  • yujin753
  • yujin753
  • 2015年06月26日 17:37
  • 2255

设计模式——代理模式实现与原理分析

代理模式也称为委托模式,也是极为重要的设计模式之一。代理在我们日常生活中其实很常见,对于程序员来说最常接触的莫过于使用代理上网,连接上代理服务器地址,就可以轻松畅游全世界的网络;让同事帮忙带饭也是一种...
  • ylyg050518
  • ylyg050518
  • 2016年11月12日 18:50
  • 1377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记(十三)——Proxy代理模式
举报原因:
原因补充:

(最多只允许输入30个字)