【设计模式】代理模式

来源:互联网 发布:淘宝追加评价在哪 编辑:程序博客网 时间:2024/05/18 14:45

概述


 对一个对象访问控制的一个原因是为了在我们确实需要这个对象的时候才对它进行创建和初始化。Proxy代理模式是一种结构型设计模式,主要解决的是直接访问对象时带来的问题。

比如说:要访问的对象并不在本地,而是在远程的机器上。
有些对象由于某些原因(比如对象创建开销很大,我们不希望一开始就创建该对象,会有延迟创建对象的想法),例如,我们知道Word程序的功能很多,我们可以完成文字、图片等操作,但是不是我们每一次打开都实例化所有的对象,而是使用哪些对象再实现相应的对象。

直接访问会给使用者或者系统结构带来很多麻烦,所以我们不直接访问,而是通过第三者完成对真实对象的访问。



定义


在《设计模式》中,将其定义为:为其他对象提供一种代理以控制对这个对象的访问。顾名思义,不是直接访问对象,而是通过第三者来完成对对象的操作。





实现

我们通过送花的例子来说明代理模式

//定义接口    interface IGiveGift    {        void GiveFlowers();     //送鲜花    }


定义了Pursuit类和Proxy类的共用接口,任何使用Pursuit类的地方都可以使用Proxy类。


//被追求者类    class Girl    {        private string name;    //被追求者的名字        public string Name      //获取和设置被追求者的名字        {            get             {                return name;            }            set            {                name = value;            }        }    }


//追求者类实现“送礼物”接口    class Pursuit:IGiveGift    {        Girl mm;        public Pursuit(Girl mm)     //构造方法,将被追求者传递给追求者        {            this.mm = mm;        }        public void GiveFlowers()        {            Console.WriteLine(mm.Name + ",送你鲜花");        }    }

//代理类,追求者通过代理来给女孩送花    class Proxy : IGiveGift         //实现“送礼物”接口    {        Pursuit gg;        public Proxy(Girl mm)        {            gg = new Pursuit(mm );        }        public void GiveFlowers()        {            gg.GiveFlowers();       //调用追求者类的“送鲜花”方法        }    }

class Program    {        static void Main(string[] args)        {            Girl huahua = new Girl();       //实例化对象 huahua            huahua.Name = "花花";           //花花            Proxy songhuaren = new Proxy (huahua );            songhuaren.GiveFlowers();       //送花人送花给“花花”            Console.ReadKey();        }    }




使用场景


远程代理(Remote Proxy )



为一个对象在不同的地址空间提供局部代表。可以隐藏一个对象存在于不同地址空间的事实。

我想这个可能会有一个很经典的例子,如果我们想绕过GFW访问Google,可以通过使用代理或者VPN来实现,那么代理方式就是使用浏览器访问站点的请求都不会直接发给目的主机,而是先发给代理服务器,代理服务器接受了客户的请求以后,由代理服务器向目的主机发出请求,并接受目的主机的数据,存于代理服务器的硬盘中,然后再由代理服务器将客户要求的数据发给客户。实际上客户没有直接访问目的主机,但是在客户看来就像直接访问目的主机一样。

虚拟代理(Virtual Proxy)


是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。


在上网的时候,我们可能会有这样的体验,如果打开一个图片比较多的网站,能够迅速响应的是网页中的文字,而图片会一张一张一点一点显示出来。或者有的网页发布时间比较长了,其中一些图片已经失效了,会使用没有任何内容的图片框来代替。这些就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。



保护代理(Protection Proxy)


控制对原始对象的访问,保护代理用于对象应该有不同的访问权限时。


比如一般用户和管理员对原始对象的访问,一般用户和管理员分别通过不同的代理来完成访问限制。


智能指引(Smart Reference)


是指当调用真实的对象时,代理处理另外的一些事。

比如将对此对象调用的次数记录下来等。


小结


使用代理模式能帮我们解决问题,它有它自己的优点:职责清晰、高拓展性、智能化,但同样也有缺陷,由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。但是对于用户来说,用户是看不到中间代理对象的。还有实现代理模式需要额外的工作,有些代理模式的实现非常复杂。






0 0