资源描述
标题标题标题,第一级,第二级,第三级,*,www,.,ChinaSA,.,info,www,.,ChinaSA,.,info,标题标题标题,第一级,第二级,第三级,D,esign,P,atterns,代理模式,刘 伟,(Sunny),大纲,代理模式概述,代理模式的结构与实现,代理模式的应用实例,远程代理,虚拟代理,缓冲代理,代理模式的优缺点与适用环境,2,代理模式概述,商品代购示意图,3,代理模式概述,分析,代购商品:顾客,代购网站,商品,软件开发:客户端,代理对象,真实对象,客户端,代理对象,真实对象,4,代理模式概述,类型,远程代理,保护代理,虚拟代理,缓冲代理,智能引用代理,代理模式,5,代理模式概述,代理模式的定义,对象结构型,模式,代理模式:,给某一个对象提供,一个代理或占位符,,并由代理对象来控制对原对象的访问。,Proxy Pattern:,Provide,a surrogate or placeholder,for another object to control access to it.,6,代理模式概述,代理模式的定义,引入一个新的,代理对象,代理对象,在客户端对象和目标对象之间起到中介的作用,去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务,7,代理模式的结构与实现,代理模式的结构,8,代理模式的结构与实现,代理模式的结构,代理模式包含以下,3,个角色:,Subject,(抽象主题角色),Proxy,(代理主题角色),RealSubject,(真实主题角色),9,代理模式的结构与实现,代理模式的实现,抽象主题类典型代码:,abstract class Subject,public abstract void Request();,10,代理模式的结构与实现,代理模式的实现,真实主题类典型代码:,class RealSubject:Subject,public override void Request(),/业务方法具体实现代码,11,代理模式的结构与实现,代理模式的实现,代理类典型代码:,class Proxy:Subject,private RealSubject realSubject=new RealSubject();/维持一个对真实主题对象的引用,public void PreRequest(),.,public override void Request(),PreRequest();,realSubject.Request();/调用真实主题对象的方法,PostRequest();,public void PostRequest(),12,代理模式的结构与实现,几种常见的代理模式,远程代理,(Remote Proxy),:,为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中,远程代理又称为大使,(Ambassador),虚拟代理,(Virtual Proxy),:,如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建,13,代理模式的结构与实现,几种常见的代理模式,保护代理,(Protect Proxy),:,控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限,缓冲代理,(Cache Proxy),:,为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果,智能引用代理,(Smart Reference Proxy),:,当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等,14,代理模式的应用实例,实例说明,某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:,(1),在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;,(2),在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。,该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。,现使用代理模式设计并实现该收费商务信息查询系统。,15,代理模式的应用实例,实例分析及类图,商务信息查询系统设计方案示意图,16,代理模式的应用实例,实例分析及类图,商务信息查询系统结构图,17,代理模式的应用实例,实例代码,(1)AccessValidator,:身份验证类,业务类,(2)Logger,:日志记录类,业务类,(3)Searcher,:抽象查询类,充当抽象主题角色,(4)RealSearcher,:具体查询类,充当真实主题角色,(5)ProxySearcher,:代理查询类,充当代理主题角色,(6),配置文件,App.config,(7)Program,:客户端测试类,演示,参考代码,(DesignPatternProxySample),18,代理模式的应用实例,结果及分析,保护代理,和,智能引用代理,在代理类,ProxySearcher,中实现对真实主题类的,权限控制,和,引用计数,19,远程代理,动机,客户端程序可以访问在远程主机上的对象,,远程主机可能具有更好的计算性能与处理速度,可以快速地响应并处理客户端的请求,可以,将网络的细节隐藏起来,,使得客户端不必考虑网络的存在,客户端完全可以认为被代理的远程业务对象是在本地而不是在远程,而,远程代理对象承担了大部分的网络通信工作,并负责对远程业务方法的调用,20,远程代理,结构,21,虚拟代理,动机,对于一些,占用系统资源较多或者加载时间较长的对象,,可以给这些对象提供一个虚拟代理,在真实对象创建成功之前,虚拟代理扮演真实对象的替身,,而当真实对象创建之后,,虚拟代理将用户的请求转发给真实对象,使用一个“虚假”的代理对象来代表真实对象,通过代理对象来间接引用真实对象,可以,在一定程度上提高系统的性能,22,虚拟代理,应用,由于对象本身的复杂性或者网络等原因导致,一个对象需要较长的加载时间,,此时可以,用一个加载时间相对较短的代理对象来代表真实对象,(结合,多线程技术,),一个对象的加载十分耗费系统资源,,让那些占用大量内存或处理起来非常复杂的对象推迟到使用它们的时候才创建,而在此之前,用一个相对来说占用资源较少的代理对象来代表真实对象,,,再通过代理对象来引用真实对象,(,用时间换取空间,),23,缓冲代理,动机,为某一个操作的结果提供临时的缓存存储空间,,以便在后续使用中能够,共享这些结果,可以,避免某些方法的重复执行,优化系统性能,24,缓冲代理,应用,PetShop 4.0,的业务逻辑层,(Business Logic Layer,BLL),PetShop4.0,缓存代理示意图,25,缓冲代理,应用,public static class ProductDataProxy,private static readonly int productTimeout=int.Parse(ConfigurationManager.AppSettings ProductCacheDuration);,private static readonly bool enableCaching=bool.Parse(ConfigurationManager.AppSettingsEnableCaching);,public static IList GetProductsByCategory(string category),Product product=new Product();,/如果缓存被禁用,则直接通过product对象来获取数据,if(!enableCaching),return product.GetProductsByCategory(category);,string key=product_by_category_+category;,/从缓存中获取数据,IList data=(IList)HttpRuntime.Cachekey;,/如果缓存中没有数据则执行如下代码,if(data=null),data=product.GetProductsByCategory(category);,/通过工厂创建AggregateCacheDependency对象,AggregateCacheDependency cd=DependencyFacade.GetProductDependency();,/将数据存储在缓存中,并添加必要的AggregateCacheDependency对象,HttpRuntime.Cache.Add(key,data,cd,DateTime.Now.AddHours(product Timeout),Cache.NoSlidingExpiration,CacheItemPriority.High,null);,return data;,26,代理模式的优缺点与适用环境,模式优点,能够,协调调用者和被调用者,,在一定程度上,降低了系统的耦合度,客户端可以针对抽象主题角色进行编程,,增加和更换代理类无须修改源代码,符合开闭原则,,系统具有较好的灵活性和可扩展性,27,代理模式的优缺点与适用环境,模式优点,逐个分析,远程代理:,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,,提高了系统的整体运行效率,虚拟代理:,通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,,可以在一定程度上节省系统的运行开销,缓冲代理:,为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,,优化系统性能,缩短执行时间,保护代理:,可以控制对一个对象的访问权限,,为不同用户提供不同级别的使用权限,28,代理模式的优缺点与适用环境,模式缺点,由于在客户端和真实主题之间增加了代理对象,因此,有些类型的代理模式可能会造成请求的处理速度变慢,(例如,保护代理,),实现代理模式需要额外的工作,而且,有些代理模式的实现过程较为复杂,(例如,远程代理,),29,代理模式的优缺点与适用环境,模式适用环境,当客户端对象需要访问远程主机中的对象时可以使用,远程代理,当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用,虚拟代理,当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用,缓冲代理,当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用,保护代理,当需要为一个对象的访问(引用)提供一些额外的操作时可以使用,智能引用代理,30,END,Thanks!,31,
展开阅读全文