一、引言
在系统开发过程中,大多会遇到跨网络做系统应用间数据对接问题,但目标对象不允许跨网络直接访问数据,通常考虑到网络和安全性能等因素,开发者会在客户端和目标对象间添加一层中间层--代理层,也是即将要介绍的代理模式(Proxy)。
二、代理模式介绍
在介绍代理模式前,我们首先看一下代理模式的分类
1.远程(Remote)代理:为一个位于不同地址空间的对象提供局部代表对象,隐藏一个对象存在于不同地址空间的事实。
典型例子:webservice在.NET中的应用,在应用程序项目中加入web引用,引用一个webservice,会生成WebReference文件夹和一些文件,其实它们就是代理,使得客户端程序调用代理就可以解决远程访问的问题。
2.虚拟(Virtual)代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,使得此对象只在需要时才被真正创建。
典型例子:图片延迟加载(ImageLazyLoad),当打开一个很大的HTML网页时,可以看到所有文字,但是图片是一张一张下载后才能看到。未打开的图片框,就是通过虚拟代理替代了真实图片,此时代理存放了真实图片的尺寸和路径。好处是 代理对象可以在必要的时候才将被代理对象加载,加载可以在加载过程加以必要的优化
3.安全(Protection)代理:控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候
4.智能引用(Smart Reference)代理:指当调用真实的对象时,代理处理另外一些事。比如将真实对象的引用次数记录下来
5.Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有客户端真正需要时才执行。一般对象的深克隆是一个开销很大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到时才被克隆
定义:为其他对象提供一种代理以控制对这个对象的访问
三、代理模式实现
介绍完代理模式的定义,下面用以生活中的例子解释一下代理模式,海外代购,这个场景中代购(ProxyBuyPerson)就是我们(RealBuyPerson)的一个代理,统一公共接口买产品(BuyProduct)
//抽象主题角色 public abstract class Person { public abstract void BuyProduct(); } //真实主题角色 class RealBuyPerson : Person { public override void BuyProduct() { Console.WriteLine($"买一个Iphone和一台苹果电脑"); } } //代理角色 class ProxyBuyPerson : Person { //引用真实主题实例 RealBuyPerson realPerson; public override void BuyProduct() { if(realPerson==null) { realPerson = new RealBuyPerson(); } this.BeforeBuyProduct(); realPerson.BuyProduct(); this.AfterBuyProduct(); } private void BeforeBuyProduct() { Console.WriteLine($"列个清单,确认要买的东西"); } private void AfterBuyProduct() { Console.WriteLine($"核对清单,确定没有买错"); } } class Program { static void Main(string[] args) { //创建一个代理对象 Person proxy = new ProxyBuyPerson(); proxy.BuyProduct(); Console.Read(); } }
优点:
1.代理模式能够将调用与真正被调用的对象隔离,在一定程度上降低了系统耦合度
2.代理对象在客户端和目标对象之间起到一个中介作用,可以对目标对象起到一个保护作用。可以在对目标对象发出请求前做一个额外操作,如权限检查
缺点:
1.由于在客户端和真实主题之间增加了代理对象,因此有些代理模式可能会造成请求的处理速度变慢
2.实现代理类需要额外的工作,从而增加了系统实现复杂度
分析:
代理模式与适配器模式:适配器为它所适配的对象提供一个不同的接口;代理提供了与它的实体相同的接口
代理模式与装饰模式:代理模式在上层接口中定义了主要功能,而代理提供功能控制对象的访问权限;装饰模式在上层接口中定义了部分功能,通过装饰链动态给对象增加职能
本文关于代理模式的学习就到这里结束了,设计模式之结构型设计模式(关注对象的组合)的学习也告一段落。
文中如有不足,欢迎斧正,感谢您的阅读。