欢迎来到广州某某酒业有限公司官方网站!

新闻资讯

「天天一个知识点」精讲设计模式之署理模式

作者:乐鱼体育官方入口 时间:2022-06-25 04:10
本文摘要:点击上方"java全栈技术"关注,天天学习一个java知识点原创:刘伟署理模式是常用的结构型设计模式之一,当无法直接会见某个工具或会见某个工具存在难题时可以通过一个署理工具来间接会见,为了保证客户端使用的透明性,所会见的真实工具与署理工具需要实现相同的接口。凭据署理模式的使用目的差别,署理模式又可以分为多种类型,例如掩护署理、远程署理、虚拟署理、缓冲署理等,它们应用于差别的场所,满足用户的差别需求。1 署理模式概述近年来,代购已逐步成为电子商务的一个重要分支。

乐鱼体育官方下载

点击上方"java全栈技术"关注,天天学习一个java知识点原创:刘伟署理模式是常用的结构型设计模式之一,当无法直接会见某个工具或会见某个工具存在难题时可以通过一个署理工具来间接会见,为了保证客户端使用的透明性,所会见的真实工具与署理工具需要实现相同的接口。凭据署理模式的使用目的差别,署理模式又可以分为多种类型,例如掩护署理、远程署理、虚拟署理、缓冲署理等,它们应用于差别的场所,满足用户的差别需求。1 署理模式概述近年来,代购已逐步成为电子商务的一个重要分支。何谓代购,简朴来说就是找人帮助购置所需要的商品,固然你可能需要向实施代购的人支付一定的用度。

代购通常分为两种类型:一种是因为在当地买不到某件商品,又或者是因为当地这件商品的价钱比其他地域的贵,因此托人在其他地域甚至外洋购置该商品,然后通过快递发货或者直接携带回来;另有一种代购,由于消费者对想要购置的商品相关信息的缺乏,自已无法确定其实际价值而又不想被商家宰,只好委托中介机构帮其论价或为其代买。代购网站为此应运而生,它为消费者提供在线的代购服务,如果看中某外洋购物网站上的商品,可以登录代购网站填写代购单并付款,代购网站会资助举行购置然后通过快递公司将商品发送给消费者。商品代购历程如图1所示:图1 商品代购示意图在软件开发中,也有一种设计模式可以提供与代购网站类似的功效。由于某些原因,客户端不想或不能直接会见一个工具,此时可以通过一个称之为“署理”的圈外人来实现间接会见,该方案对应的设计模式被称为署理模式。

署理模式是一种应用很广泛的结构型设计模式,而且变化形式很是多,常见的署理形式包罗远程署理、掩护署理、虚拟署理、缓冲署理、智能引用署理等,后面将学习这些差别的署理形式。署理模式界说如下:署理模式:给某一个工具提供一个署理或占位符,并由署理工具来控制对原工具的会见。Proxy Pattern: Provide a surrogate or placeholder for another object to control access to it.署理模式是一种工具结构型模式。在署理模式中引入了一个新的署理工具,署理工具在客户端工具和目的工具之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的分外的新服务。

2 署理模式结构与实现2.1 模式结构署理模式的结构比力简朴,其焦点是署理类,为了让客户端能够一致性地看待真实工具和署理工具,在署理模式中引入了抽象层,署理模式结构如图2所示:图2 署理模式结构图由图2可知,署理模式包罗如下三个角色: (1) Subject(抽象主题角色):它声明晰真实主题和署理主题的配合接口,这样一来在任何使用真实主题的地方都可以使用署理主题,客户端通常需要针对抽象主题角色举行编程。(2) Proxy(署理主题角色):它包罗了对真实主题的引用,从而可以在任何时候操作真实主题工具;在署理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;署理主题角色还可以控制对真实主题的使用,卖力在需要的时候建立和删除真实主题工具,并对真实主题工具的使用加以约束。

通常,在署理主题角色中,客户端在挪用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯挪用真实主题工具中的操作。(3) RealSubject(真实主题角色):它界说了署理角色所代表的真实工具,在真实主题角色中实现了真实的业务操作,客户端可以通过署理主题角色间接挪用真实主题角色中界说的操作。

2.2 模式实现署理模式的结构图比力简朴,可是在真实的使用和实现历程中要庞大许多,特别是署理类的设计和实现。抽象主题类声明晰真实主题类和署理类的公共方法,它可以是接口、抽象类或详细类,客户端针对抽象主题类编程,一致性地看待真实主题和署理主题,典型的抽象主题类代码如下:真实主题类继续了抽象主题类,提供了业务方法的详细实现,其典型代码如下:署理类也是抽象主题类的子类,它维持一个对真实主题工具的引用,挪用在真实主题中实现的业务方法,在挪用时可以在原有业务方法的基础上附加一些新的方法来对功效举行扩充或约束,最简朴的署理类实现代码如下:在实际开发历程中,署理类的实现比上述代码要庞大许多,署理模式凭据其目的和实现方式差别可分为许多种类,其中常用的几种署理模式简要说明如下: (1) 远程署理(Remote Proxy):为一个位于差别的地址空间的工具提供一个当地的署理工具,这个差别的地址空间可以是在同一台主机中,也可是在另一台主机中,远程署理又称为大使(Ambassador)。(2) 虚拟署理(Virtual Proxy):如果需要建立一个资源消耗较大的工具,先建立一个消耗相对较小的工具来表现,真实工具只在需要时才会被真正建立。

(3) 掩护署理(Protect Proxy):控制对一个工具的会见,可以给差别的用户提供差别级此外使用权限。(4) 缓冲署理(Cache Proxy):为某一个目的操作的效果提供暂时的存储空间,以便多个客户端可以共享这些效果。

(5) 智能引用署理(Smart Reference Proxy):当一个工具被引用时,提供一些分外的操作,例如将工具被挪用的次数记载下来等。在这些常用的署理模式中,有些署理类的设计很是庞大,例如远程署理类,它封装了底层网络通信和对远程工具的挪用,其实现较为庞大。3 署理模式应用实例下面通过一个应用实例来进一步学习和明白署理模式。

1. 实例说明 某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下: (1) 在举行商务信息查询之前用户需要通过身份验证,只有正当用户才气够使用该查询系统; (2) 在举行商务信息查询时系统需要记载查询日志,以便凭据查询次数收取查询用度。该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记载功效,客户端代码可以无区别地看待原始的商务信息查询模块和增加新功效之后的商务信息查询模块,而且可能在未来还要在该信息查询模块中增加一些新的功效。试使用署理模式设计并实现该收费商务信息查询系统。

2. 实例分析及类图通太过析,可以接纳一种间接会见的方式来实现该商务信息查询系统的设计,在客户端工具和信息查询工具之间增加一个署理工具,让署理工具来实现身份验证和日志记载等功效,而无须直接对原有的商务信息查询工具举行修改,如图3所示:图3 商务信息查询系统设计方案示意图在图3中,客户端工具通过署理工具间接会见具有商务信息查询功效的真实工具,在署理工具中除了挪用真实工具的商务信息查询功效外,还增加了身份验证和日志记载等功效。使用署理模式设计该商务信息查询系统,结构图如图4所示。图4 商务信息查询系统结构图在图4中,业务类AccessValidator用于验证用户身份,业务类Logger用于记载用户查询日志,Searcher充当抽象主题角色,RealSearcher充认真实主题角色,ProxySearcher充今世理主题角色。

3. 实例代码(1) AccessValidator:身份验证类,业务类,它提供方法Validate()来实现身份验证。(2) Logger:日志记载类,业务类,它提供方法Log()来生存日志。(3) Searcher:抽象查询类,充当抽象主题角色,它声明晰DoSearch()方法。

(4) RealSearcher:详细查询类,充认真实主题角色,它实现查询功效,提供方法DoSearch()来查询信息。(5) ProxySearcher:署理查询类,充今世理主题角色,它是查询署理,维持了对RealSearcher工具、AccessValidator工具和Logger工具的引用。

(6) 设置文件App.config,在设置文件中存储了署理主题类类名。(7) Program:客户端测试类 4. 效果及分析编译并运行法式,输出效果如下:在数据库中验证用户'杨过'是否是正当用户?'杨过'登录乐成!用户'杨过'使用关键词'玉女心经'查询商务信息!更新数据库,用户'杨过'查询次数加1!本实例是掩护署理和智能引用署理的应用实例,在署理类ProxySearcher中实现对真实主题类的权限控制和引用计数,如果需要在会见真实主题时增加新的会见控制机制和新功效,只需增加一个新的署理类,再修改设置文件,在客户端代码中使用新增署理类即可,源代码无须修改,切合开闭原则。4 远程署理 远程署理(Remote Proxy)是一种常用的署理模式,它使得客户端法式可以会见在远程主机上的工具,远程主机可能具有更好的盘算性能与处置惩罚速度,可以快速响应并处置惩罚客户端的请求。远程署理可以将网络的细节隐藏起来,使得客户端不必思量网络的存在。

客户端完全可以认为被署理的远程业务工具是在当地而不是在远程,而远程署理工具负担了大部门的网络通信事情,并卖力对远程业务方法的挪用。远程署理示意图如图15-5所示,客户端工具不能直接会见远程主机中的业务工具,只能接纳间接会见的方式。

远程业务工具在当地主机中有一个署理工具,该署理工具卖力对远程业务工具的会见和网络通信,它对于客户端工具而言是透明的。客户端无须体贴实现详细业务的是谁,只需要根据服务接口所界说的方式直接与当地主机中的署理工具交互即可。

图15 远程署理示意图在基于.NET平台的漫衍式技术,例如DCOM(Distribute Component Object Model,漫衍式组件工具模型)、Web Service中,都应用了远程署理模式,大家可以查阅相关资料举行扩展学习。5 虚拟署理 虚拟署理(Virtual Proxy)也是一种常用的署理模式,对于一些占用系统资源较多或者加载时间较长的工具,可以给这些工具提供一个虚拟署理。在真实工具建立乐成之前虚拟署理饰演真实工具的替身,而认真实工具建立之后,虚拟署理将用户的请求转发给真实工具。

通常,在以下两种情况下可以思量使用虚拟署理:(1) 由于工具自己的庞大性或者网络等原因导致一个工具需要较长的加载时间,此时可以用一个加载时间相对较短的署理工具来代表真实工具。通常在实现时可以联合多线程技术,一个线程用于显示署理工具,其他线程用于加载真实工具。这种虚拟署理模式可以应用在法式启动的时候,由于建立署理工具在时间和处置惩罚庞大度上要少于建立真实工具,因此,在法式启动时,可以用署理工具取代真实工具初始化,大大加速了系统的启动时间。

当需要使用真实工具时,再通过署理工具来引用,而此时真实工具可能已经乐成加载完毕,可以缩短用户的等候时间。(2) 当一个工具的加载十分泯灭系统资源的时候,也很是适合使用虚拟署理。

虚拟署理可以让那些占用大量内存或处置惩罚起来很是庞大的工具推迟到使用它们的时候才建立,而在此之前用一个相对来说占用资源较少的署理工具来代表真实工具,再通过署理工具来引用真实工具。为了节约内存,在第一次引用真实工具时再建立工具,而且该工具可被多次重用,在以后每次会见时需要检测所需工具是否已经被建立,因此在会见该工具时需要举行存在性检测,这需要消耗一定的系统时间,可是可以节约内存空间,这是一种用时间换取空间的做法。无论是以上哪种情况,虚拟署理都是用一个“虚假”的署理工具来代表真实工具,通过署理工具来间接引用真实工具,可以在一定水平上提高系统的性能。

6 缓冲署理缓冲署理(Cache Proxy)也是一种较为常用的署理模式,它为某一个操作的效果提供暂时的缓存存储空间,以便在后续使用中能够共享这些效果,从而可以制止某些方法的重复执行,优化系统性能。在微软示例项目PetShop 4.0的业务逻辑层(Business Logic Layer, BLL)中界说了Product、Category、Item等类,它们封装了相关的业务方法,用于挪用数据会见层(Data Access Layer, DAL)工具会见数据库,以获取相关数据。为了革新系统性能,PetShop 4.0为这些实现方法增加缓存机制,引入一个新的工具去控制原来的BLL业务逻辑工具,这些新的工具对应于署理模式中的署理工具。

在引入署理模式后,实现了在缓存级别上对业务工具的封装,增强了对业务工具的控制,如果需要会见的数据在缓存中已经存在,则无须再重复执行获取数据的方法,直接返回存储在缓存中的数据即可。由于原有业务工具(真实工具)和新增署理工具袒露在外的方法是一致的,因而对于挪用方即客户端而言,挪用署理工具与真实工具并没有实质的区别。这些新引入的署理类包罗ProductDataProxy、CategoryDataProxy和ItemDataProxy等。

下面以PetShop.BLL.Product业务工具为例举行说明,PetShop 4.0为其建设了署理工具ProductDataProxy,并在ProductDataProxy的GetProductsByCategory()方法中挪用了业务逻辑层Product类的GetProductsByCategory()方法,同时增加了缓存机制。如图15-6所示:图6 PetShop4.0缓存署理示意图在ProductDataProxy类中存在如下代码片段:在上述代码中,AggregateCacheDependency是从.NET Framework 2.0开始新增的一个类,它卖力监视依赖项工具的荟萃。

当这个荟萃中的任意一个依赖项工具发生改变时,该依赖项工具对应的缓存工具都将被自动移除。在此差池AggregateCacheDependency举行详细说明,大家可以查阅相关资料举行扩展学习。与业务逻辑层Product工具的GetProductsByCategory()方法相比,上述代码增加了缓存机制。

当缓存内不存在相关数据项时,则直接挪用业务逻辑层Product的GetProductsByCategory()方法来获取数据,并将其与对应的AggregateCacheDependency工具一起存储在缓存中。在ProductDataProxy类的每一个业务方法中都实例化了Product类,再挪用Product类的相应方法,因此ProductDataProxy与Product之间属于依赖关系,这是尺度署理模式的一种变形,可以根据尺度署理模式对其举行革新,包罗引入高层的抽象接口。7 署理模式效果与适用场景署理模式是常用的结构型设计模式之一,它为工具的间接会见提供了一个解决方案,可以对工具的会见举行控制。

署理模式类型较多,其中远程署理、虚拟署理、掩护署理等在软件开发中应用很是广泛。7.1 模式优点署理模式的配合优点如下:(1) 能够协调挪用者和被挪用者,在一定水平上降低了系统的耦合度。(2) 客户端可以针对抽象主题角色举行编程,增加和更换署理类无须修改源代码,切合开闭原则,系统具有较好的灵活性和可扩展性。

此外,差别类型的署理模式也具有奇特的优点,例如:(1) 远程署理为位于两个差别地址空间工具的会见提供了一种实现机制,可以将一些消耗资源较多的工具和操作移至性能更好的盘算机上,提高系统的整体运行效率。(2) 虚拟署理通过一个消耗资源较少的工具来代表一个消耗资源较多的工具,可以在一定水平上节约系统的运行开销。

(3) 缓冲署理为某一个操作的效果提供暂时的缓存存储空间,以便在后续使用中能够共享这些效果,优化系统性能,缩短执行时间。(4) 掩护署理可以控制对一个工具的会见权限,为差别用户提供差别级此外使用权限。

7.2 模式缺点署理模式的主要缺点如下:(1) 由于在客户端和真实主题之间增加了署理工具,因此有些类型的署理模式可能会造成请求的处置惩罚速度变慢,例如掩护署理。(2) 实现署理模式需要分外的事情,而且有些署理模式的实现历程较为庞大,例如远程署理。

7.3 模式适用场景署理模式的类型较多,差别类型的署理模式有差别的优缺点,它们应用于差别的场所: (1) 当客户端工具需要会见远程主机中的工具时可以使用远程署理。(2) 当需要用一个消耗资源较少的工具来代表一个消耗资源较多的工具,从而降低系统开销、缩短运行时间时可以使用虚拟署理,例如一个工具需要很长时间才气完成加载时。

(3) 当需要为某一个被频繁会见的操作效果提供一个暂时存储空间,以供多个客户端共享会见这些效果时可以使用缓冲署理。通过使用缓冲署理,系统无须在客户端每一次会见时都重新执行操作,只需直接从暂时缓冲区获取操作效果即可。(4) 当需要控制对一个工具的会见,为差别用户提供差别级此外会见权限时可以使用掩护署理。

(5) 当需要为一个工具的会见(引用)提供一些分外的操作时可以使用智能引用署理。动态署理的实现动态署理作为署理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来解说Java动态署理的实现历程。通常情况下,署理模式中的每一个署理类在编译之后都市生成一个class文件,署理类所实现的接口和所署理的方法都被牢固,这种署理被称之为静态署理(Static Proxy)。

那么有没有一种机制能够让系统在运行时动态建立署理类?谜底就是本文将要先容的动态署理(Dynamic Proxy)。动态署理是一种较为高级的署理模式,它在事务治理、AOP(Aspect-OrientedProgramming,面向方面编程)等领域都发挥了重要的作用。

在传统的署理模式中,客户端通过Proxy类挪用RealSubject类的request()方法,同时还可以在署理类中封装其他方法(如preRequest()和postRequest()等)。如果根据这种方法使用署理模式,那么署理类和真实主题类都应该是事先已经存在的,署理类的接口和所署理方法都已明确指定,如果需要为差别的真实主题类提供署理类或者署理一个真实主题类中的差别方法,都需要增加新的署理类,这将导致系统中的类个数急剧增加,因此需要想措施淘汰系统中类的个数。动态署理可以让系统能够凭据实际需要来动态建立署理类,让同一个署理类能够署理多个差别的真实主题类而且可以署理差别的方法。

从JDK 1.3开始,Java语言提供了对动态署理的支持,Java语言实现动态署理时需要用到位于java.lang.reflect包中的一些类,现简要说明如下: (1) Proxy类Proxy类提供了用于建立动态署理类和实例工具的方法,它是所建立的动态署理类的父类,它最常用的方法如下:public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces):该方法用于返回一个Class类型的署理类,在参数中需要提供类加载器并需要指定署理的接口数组(与真实主题类的接口列表一致)。public static Object newProxyInstance(ClassLoader loader, Class<?>[]interfaces, InvocationHandler h):该方法用于返回一个动态建立的署理类的实例,方法中第一个参数loader表现署理类的类加载器,第二个参数interfaces表现署理类所实现的接口列表(与真实主题类的接口列表一致),第三个参数h表现所指派的挪用处置惩罚法式类。(2) InvocationHandler接口InvocationHandler接口是署理处置惩罚法式类的实现接口,该接口作为署理实例的挪用处置惩罚者的公共父类,每一个署理类的实例都可以提供一个相关的详细挪用处置惩罚者(InvocationHandler接口的子类)。在该接口中声明晰如下方法:public Object invoke(Objectproxy, Method method, Object[] args):该方法用于处置惩罚对署理类实例的方法挪用并返回相应的效果,当一个署理实例中的业务方法被挪用时将自动挪用该方法。

invoke()方法包罗三个参数,其中第一个参数proxy表现署理类的实例,第二个参数method表现需要署理的方法,第三个参数args表现署理方法的参数数组。动态署理类需要在运行时指定所署理真实主题类的接口,客户端在挪用动态署理工具的方法时,挪用请求会将请求自动转发给InvocationHandler工具的invoke()方法,由invoke()方法来实现对请求的统一处置惩罚。

下面通过一个简朴实例来学习如何使用动态署理模式:Sunny软件公司欲为公司OA系统数据会见层DAO增加方法挪用日志,记载每一个方法被挪用的时间和挪用效果,现使用动态署理举行设计和实现。本实例完整代码如下所示:编写如下客户端测试代码: 编译并运行法式,输出效果如下:挪用时间:13:47:14查询ID为张无忌的用户信息乐成!方法挪用竣事!------------------------------挪用时间:13:47:14删除ID为D002的文档信息失败!方法挪用竣事! 通过使用动态署理,我们可以实现对多个真实主题类的统一署理和集中控制。注:JDK中提供的动态署理只能署理一个或多个接口,如果需要动态署理详细类或抽象类,可以使用CGLib(Code Generation Library)等工具,CGLib是一个功效较为强大、性能和质量也较好的代码生成包,在许多AOP框架中都得以广泛应用,大家可以自行查阅相关资料来学习CGLib。


本文关键词:「,天天,一个,知识点,」,乐鱼体育官方入口,精讲,设计模式,之

本文来源:乐鱼体育平台-www.jiuzhang-sh.com

Copyright © 2004-2021 www.jiuzhang-sh.com. 乐鱼体育平台科技 版权所有 技术支持:百度