您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 15-C#设计模式-代理模式
代理模式刘伟(Sunny)weiliu_china@126.com大纲代理模式概述代理模式的结构与实现代理模式的应用实例远程代理虚拟代理缓冲代理代理模式的优缺点与适用环境代理模式概述商品代购示意图代购网站商品代购商品购买商品代理模式概述分析代购商品:顾客代购网站商品软件开发:客户端代理对象真实对象客户端代理对象真实对象代理模式概述类型远程代理保护代理虚拟代理缓冲代理智能引用代理……代理模式代理模式概述代理模式的定义对象结构型模式代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。ProxyPattern:Provideasurrogateorplaceholderforanotherobjecttocontrolaccesstoit.代理模式概述代理模式的定义引入一个新的代理对象代理对象在客户端对象和目标对象之间起到中介的作用去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务代理模式的结构与实现代理模式的结构realSubjectPreRequest();realSubject.Request();PostRequest();Subject+Request()...Proxy-realSubject:RealSubject+++PreRequest()Request()PostRequest()...RealSubject+Request()...Client代理模式的结构与实现代理模式的结构代理模式包含以下3个角色:•Subject(抽象主题角色)•Proxy(代理主题角色)•RealSubject(真实主题角色)代理模式的结构与实现代理模式的实现抽象主题类典型代码:abstractclassSubject{publicabstractvoidRequest();}代理模式的结构与实现代理模式的实现真实主题类典型代码:classRealSubject:Subject{publicoverridevoidRequest(){//业务方法具体实现代码}}代理模式的结构与实现代理模式的实现代理类典型代码:classProxy:Subject{privateRealSubjectrealSubject=newRealSubject();//维持一个对真实主题对象的引用publicvoidPreRequest(){…...}publicoverridevoidRequest(){PreRequest();realSubject.Request();//调用真实主题对象的方法PostRequest();}publicvoidPostRequest(){……}}代理模式的结构与实现几种常见的代理模式远程代理(RemoteProxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中,远程代理又称为大使(Ambassador)虚拟代理(VirtualProxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建代理模式的结构与实现几种常见的代理模式保护代理(ProtectProxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限缓冲代理(CacheProxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果智能引用代理(SmartReferenceProxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等代理模式的应用实例实例说明某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:(1)在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;(2)在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。现使用代理模式设计并实现该收费商务信息查询系统。代理模式的应用实例实例分析及类图商务信息查询系统设计方案示意图客户端对象代理对象真实对象身份验证商务信息查询日志记录商务信息查询访问访问调用代理模式的应用实例实例分析及类图商务信息查询系统结构图RealSearcher+DoSearch(stringuserId,stringkeyword)...:stringSearcher+DoSearch(stringuserId,stringkeyword)...:stringProxySearcher---searchervalidatorlogger:RealSearcher:AccessValidator:Logger+++DoSearch(stringuserId,stringkeyword)Validate(stringuserId)Log(stringuserId)...:string:bool:voidAccessValidator+Validate(stringuserId)...:boolLogger+Log(stringuserId)...:void代理模式的应用实例实例代码(1)AccessValidator:身份验证类,业务类(2)Logger:日志记录类,业务类(3)Searcher:抽象查询类,充当抽象主题角色(4)RealSearcher:具体查询类,充当真实主题角色(5)ProxySearcher:代理查询类,充当代理主题角色(6)配置文件App.config(7)Program:客户端测试类演示……参考代码(DesignPattern\ProxySample)代理模式的应用实例结果及分析保护代理和智能引用代理在代理类ProxySearcher中实现对真实主题类的权限控制和引用计数远程代理动机客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速地响应并处理客户端的请求可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在客户端完全可以认为被代理的远程业务对象是在本地而不是在远程,而远程代理对象承担了大部分的网络通信工作,并负责对远程业务方法的调用远程代理结构客户端对象代理对象远程业务对象本地主机远程主机网络链接虚拟代理动机对于一些占用系统资源较多或者加载时间较长的对象,可以给这些对象提供一个虚拟代理在真实对象创建成功之前虚拟代理扮演真实对象的替身,而当真实对象创建之后,虚拟代理将用户的请求转发给真实对象使用一个“虚假”的代理对象来代表真实对象,通过代理对象来间接引用真实对象,可以在一定程度上提高系统的性能虚拟代理应用由于对象本身的复杂性或者网络等原因导致一个对象需要较长的加载时间,此时可以用一个加载时间相对较短的代理对象来代表真实对象(结合多线程技术)一个对象的加载十分耗费系统资源,让那些占用大量内存或处理起来非常复杂的对象推迟到使用它们的时候才创建,而在此之前用一个相对来说占用资源较少的代理对象来代表真实对象,再通过代理对象来引用真实对象(用时间换取空间)缓冲代理动机为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果可以避免某些方法的重复执行,优化系统性能缓冲代理应用PetShop4.0的业务逻辑层(BusinessLogicLayer,BLL)ProductDataProxy+++GetProductsByCategory(stringcategory)GetProductsBySearch(stringtext)GetProduct(stringproductId)...:IList:IList:ProductInfoProduct+++GetProductsByCategory(stringcategory)GetProductsBySearch(stringtext)GetProduct(stringproductId)...:IList:IList:ProductInfo客户端PetShop4.0缓存代理示意图缓冲代理应用publicstaticclassProductDataProxy{privatestaticreadonlyintproductTimeout=int.Parse(ConfigurationManager.AppSettings[ProductCacheDuration]);privatestaticreadonlyboolenableCaching=bool.Parse(ConfigurationManager.AppSettings[EnableCaching]);publicstaticIListGetProductsByCategory(stringcategory){Productproduct=newProduct();//如果缓存被禁用,则直接通过product对象来获取数据if(!enableCaching){returnproduct.GetProductsByCategory(category);}stringkey=product_by_category_+category;//从缓存中获取数据IListdata=(IList)HttpRuntime.Cache[key];//如果缓存中没有数据则执行如下代码if(data==null){data=product.GetProductsByCategory(category);//通过工厂创建AggregateCacheDependency对象AggregateCacheDependencycd=DependencyFacade.GetProductDependency();//将数据存储在缓存中,并添加必要的AggregateCacheDependency对象HttpRuntime.Cache.Add(key,data,cd,DateTime.Now.AddHours(productTimeout),Cache.NoSlidingExpiration,CacheItemPriority.High,null);}returndata;}……}代理模式的优缺点与适用环境模式优点能够协调调用者和被调用者,在一定程度上降低了系统的耦合度客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性代理模式的优缺点与适用环境模式优点——逐个分析远程代理:可以将一些消耗资源较多的对象和操作移至性能更好的计算机
本文标题:15-C#设计模式-代理模式
链接地址:https://www.777doc.com/doc-5134645 .html