C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一、引言 2.4、模式的组成 ?? ? ??? 代理模式所涉及的角色有三个: ??? (1)、抽象主题角色(Subject):声明了真实主题和代理主题的公共接口,这样一来在使用真实主题的任何地方都可以使用代理主题。 ??? (2)、代理主题角色(Proxy):代理主题角色内部含有对真实主题的引用,从而可以操作真实主题对象;代理主题角色负责在需要的时候创建真实主题对象;代理角色通常在将客户端调用传递到真实主题之前或之后,都要执行一些其他的操作,而不是单纯地将调用传递给真实主题对象。 ??? (3)、真实主题角色(RealSubject):定义了代理角色所代表的真实对象。 ??? 附:在WCF或者WebService的开发过程中,我们在客户端添加服务引用的时候,在客户程序中会添加一些额外的类,在客户端生成的类扮演着代理主题角色,我们客户端也是直接调用这些代理角色来访问远程服务提供的操作。这个是远程代理的一个典型例子。 2.5、代理模式的分类: ??? 代理模式按照使用目的可以分为以下几种: ??? (1)、远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是本电脑中,也可以在另一台电脑中。最典型的例子就是——客户端调用Web服务或WCF服务。 ??? (2)、虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得对象只在需要时才会被真正创建。 ??? (3)、Copy-on-Write代理:虚拟代理的一种,把复制(或者叫克隆)拖延到只有在客户端需要时,才真正采取行动。 ??? (4)、保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。 ??? (5)、防火墙(Firewall)代理:保护目标不让恶意用户接近。 ??? (6)、智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。 ??? (7)、Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以这些结果。 ?? 在上面所有种类的代理模式中,虚拟代理、远程代理、智能引用代理和保护代理较为常见的代理模式。 2.6、代理模式的具体实现 ??? 说起“代理模式”,其实很容易,现实生活中的例子也很多。明星的经纪人,国家的发言人都是代理的好例子。我们就用明星经纪人这个事情来介绍“代理模式”的实现吧。 1 namespace 代理模式的实现 2 { 3 /// <summary> 4 /// 大明星都有钱,有钱了,就可以请自己的经纪人了,有了经纪人,很多事情就不用自己亲力亲为。弄点绯闻,炒作一下子通过经纪人就可以名正言顺的的操作了,万一搞不好,自己也可以否认。 5 </summary> 6 class Client 7 { 8 static void Main(string[] args) 9 { 10 //近期,Fan姓明星关注度有点下降,来点炒作 11 AgentAbstract fan = new AgentPerson(); 12 fan.Speculation("偶尔出来现现身,为炒作造势"); 13 14 Console.WriteLine(); 15 16 过了段时间,又不行了,再炒作一次 17 fan.Speculation(这段时间不火了,开始离婚炒作18 19 20 Console.Read(); 21 } 22 } 23 24 25 该类型就是抽象Subject角色,定义代理角色和真实主体角色共有的接口方法 26 public abstract AgentAbstract 27 28 29 该方法执行具体的炒作---该方法相当于抽象Subject的Request方法 30 virtual void Speculation( thing) 31 32 Console.WriteLine(thing); 33 34 35 36 该类型是Fan姓明星,有钱有势,想炒什么炒什么---相当于具体的RealSubject角色 37 sealed FanStar : AgentAbstract 38 39 有钱有势,有背景啊 40 public FanStar() { } 41 42 要有名气,定期要炒作---就是RealSubject类型的Request方法 43 override 44 45 46 47 48 49 该类型是代理类型----相当于具体的Proxy角色 50 AgentPerson : AgentAbstract 51 52 这是背后的老板, 53 private FanStar boss; 54 55 老板在后面发号施令 56 AgentPerson() 57 58 boss = FanStar(); 59 60 61 炒作的方法,执行具体的炒作---就是Proxy类型的Request方法 62 63 64 Console.WriteLine(前期弄点绯闻,拍点野照65 base.Speculation(thing); 66 Console.WriteLine(然后开发布会,伤心哭泣,继续捞钱67 68 69 }
? 从下篇文章就开始写“行为型”设计模式,今天就到此结束了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |