代理是提供允许不同的应答请求和数据交换的桥梁的程序。代理的思想以不同的方式被运用:他能够像防火墙一样保护双方的请求或者像缓存器一样缓存双方交换的数据。同样的,代理能够在不同应用之间作为充当翻译者,例如英特网与保留系统。这篇文章的目的在于使我们能专注于某一类型的代理,即java的动态代理以及他们如何被用来构造一个映像模型来支持开放执行方式和软件重用。
在面向对象程序设计中,代理是在客户和目标对象之间一种扮演中介角色的实体。为了在内容重用时使用代理,我们可以把他们的呼叫处理程式看作是元-对象用来提供应用对象的请求。元-对象的作用是观察和修改它所指对象的行为,也就是提异议。由于元-对象系统体系构成双层结构,其中提供对象的请求行为是在底层,代理服务器目标在上层,也就是元层。一个底层对象能够依附多个代理服务器,而每个代理服务器控制其某一方面的行为。
基于代理的系统支持开放执行方式。一个系统在开放执行设计原理下允许他的客户支配系统的执行结果。这允许客户根据他们的需求进行个性化定制。而开放执行的设计的目的是为了通过黑箱途径将原本可能是服务器工作区的影响强加到客户机器上。元接口可以称为是接收符合用户请求的回应代码的后门。客户端提供了默认的元接口并且在没有元接口情况下仍然正常运行。动态代理支持元程序并且允许用户定制个性化。
在《International Conference on the Principles and Practice of Programming in Java》一书的早期工作中,我们介绍了使用动态代理来建造映像模型来解决代码重用问题。而这种模型适合非分布式的应用。在本文中,我们扩充了包括分布式系统并使用不同计算机网络技术的模式,比如通过JAVA 2平台讨论如何实现在服务器端的代码重用。可重用成分,从应用的文章中分离出来独立实现类的描述或者类群的逻辑连接。同样的,在内容重用和应用软件之间的耦合减少了并且完成了可用性标准。硬盘写预补偿应用对象的可重用成分,在客户端底层运行时通过应用对象限定来实现。退藕装置通过BASE对象附带的元对象并通过直接调用BASE对象来完成,参数的改变根据JAVA机制通过在网络中不同计算机上的不同的JAVA虚拟机上发送对象数据。在远程方法调用方法,对象使用方法调用和传递远程对象参数。在公用对象请求代理[调度]程序体系结构中,对象通过对象请求代理,使用SERVER方法调用SERVER对象的参数来实现。JAVA的SERVLET,在BASE对象通过HTTP请求方法发送参数并在客户端接受HTTP应答结果。在服务器端,JAVA 的SERVLET应用服务接口实现了SERVLET访问控制以及代码重用。
这里的目标是为了展示基于动态代理分布式系统,支持开放执行和动态代理。我们解决动态代理作为构造行为映像模型的媒介,并且适用于单一JAVA虚拟机应用,也就是分布式系统。
图1.客户请求服务器向目标对象发送请求来完成他们之间的任务
图2.代理能够在派发控制之前对客户端请求进行操作
代理
代理的作用相当于在各应用之间架起传递信息的桥梁,它在很多软件中得到应用。如果从设计角度看的话,代理是一个设计模式,他描述诸如在不同的文章中重复出现的问题以及常见设计问题中普遍的解决方法。在包括WEB应用的分布式计算机系统中,代理是位于应用服务器和客户端之间的服务人员,而这个服务人员接受来自客户端的请求并代表客户向服务器发送客户请求。
如图1显示两个类的典型情况,一个client类一个Target类,Client向代理发送请求而代理向目标Target发送请求,这样来完成他们的任务,图中只有类名被显示以及UML标记被使用。
在软件生命周期,代理使软件能适应新的变化而非常有用。像追踪这种常见问题,代理提供配合新的类,并且对现有系统增加新的特征进行妥善解决。对于代理来说,现有类的代码不需要被修改,并且因为它减少潜在性测试以及文护成本而避免了现有代码的替换而令人满意。图2描述了改进后的类结构显示出代理的解决方案。Proxy类执行相同的接口并且作为委托使用Target对象。代理能够在向目标发送信息前处理客户端的请求。如果有必要用一个新的类来取代Target,代理可通过执行ITarget来保留客户端接口并且代表客户端向目标发送请求。
在网络中代理还能够支持网络安全,用来优化性能或者用来在Internet上作为翻译者来支持嵌入保留系统。就像防火墙一样,代理能够构造一个安全法则来防止未被授权的用户使用公共WEB服务。高速缓冲存储代理既减少网络负荷又减少服务器负荷,并且HTTP代理能够将客户端的HTTP请求翻译成保留系统的本机语言,并且以HTML页面形式返回。代理还能够执行懒惰的实例化,也就是延期创造和初始化一个对象直到它有实际需要。
图3无差错派发机制中包含的关键类
除了一般代理之外,JAVA还支持动态代理。一个动态代理API(应用编程接口)已经在JAVA2标准版(J2SE)译文1.3版中有介绍。通常的代理类在对相应的JAVA源文件进行编译之后以字节码形式被使用。一方面,字节码在代理对象被例示之前被载入JAVA虚拟机(JVM);另一方面,JAVA动态代理的字节码是在运行时产生的。
图3显示的是我们包含动态代理例子的关键字分类。ProxyFactory 建立一个Proxy对象并将他通过调用Proxy类的静态方法newProxyInstance()返回给客户端。建立代理实例的方法调用联接代理的AssociatedHandler对象的invoke()方法来进行发送控制。代理和目标对象之间的捆绑是通过运行时参数传递来实现的。代理方法createProxy()附带一个java.lang.Object对象类型作为参数。运行时,支持多态性的对象类型ITarget能够被传递。而目标对象通过进一步判断建立一个AssociatedHandler对象。
使用动态代理替代普通代理的优势有多种。第一,从面向对象设计观点看,当与静态的情况相比,图3的类结构罗列的较少的Proxy类和Target类之间的耦合。在两个类组之间没有直接的联系,它们的耦合在目标层动态发生。在实际中,已建的动态代理的的类型,也就是动态代理执行的接口排列,是在运行时和代理的建立同时进行。第二,动态代理的传送机制允许使用多态和映像来实现独立于目标对象的类型的一般行为。
作为一个健壮的面向对象语言,JAVA能够支持图表类型的多态性通常被作为简单的多态性提及。图表类型的多态被定义为依照所给类型的变量的机制,能够支持目标对象自己的图表类型。詹森和伏特的《Journal of Object-Objected Programming》一书中提到了一个作为面向对象机制的多态程序支持重用。本质上,与代操作理相关的invoke()方法能够被看作一个多态程序。
继承被公认为一个面向对象机制,它能够帮助实现软件重用。经验主义告诉我们,由于面向对象体系的发展,软件开发者知道在继承有优势也有缺陷。继承的优势在于它是大致能重用,缺陷在于加大了耦合性和复杂性。在Cargill G的《C++ Programming style》一书中,Cargill告戒开发者应该减少继承并且因此来减少耦合。动态代理能够用来实现代码重用并能够避免继承和聚合所带来的高耦合问题。
黑盒子实施表现了传统的申请调用方式;更确切的说是区分开实施的详细资料并且将他们隐藏在计算机接口后面。这种捆绑策略能够促进减少耦合,代码重用也同样考虑关于系统构成的正确性的推理。我们不忙于研究在运行时系统正确性对用户化系统行为的影响,并且留下这个问题做日后研究。
虽然代理的使用具有普遍优势,但是在网络环境却有着诸多限制。HTTP代理必须在保留系统能够被确定之前完全准备好。防火墙的安全性约束能够妨碍所有网络内部的发展。高速缓存代理的优势在于如cache替换策略、最低文件大小缓存以及为cache分配磁盘空间等多个方面。
映像模型在动态代理中的建立
动态代理提供了映像模型的建立。映像或者元程序引用一个系统的容量空间来推理并且遵照它自己的意志行事。映像系统为自己提供了行为的表达。除了所描述的基础系统的表达以外,其他系统还涉及应用领域或者真实世界。自我表示能够有原因地连接基础系统,也就是以基础系统的状态和行为建立自我表现的映像,反之亦然。
在传统面向对象程序设计中对象的任务是观察和修改对象所表达的东西。META对象是限制所指目标的行为,显然,元-对象它们自己也同样能通过元-对象联系来表现出。映像模型因此得到的最终组成结构是多级的并且形成一个映像塔。目标对象组装底层被称为基础对象,并且该对象的上一层是元对象。底部对象提供应用领域的表现以及因此在该领域的实体上执行。元对象在较低层实现对象运算的执行。
图4
映像根据在元实体和基础实体之间的关系划分不同模型。我们以基于META对象的方式来理解一个映像模式。在这个模式中,每个BASE对象含有一个潜在的元-基础关联。我们的元对象表现是受限制地来控制所指对象的行为并且不包含他们的状态。一个双层映像体系结构支持元-对象方式来映像(如图4)它的目的是基于:
动态代理的呼叫处理程式可解释为元对象。
元层和基础层因果关系
元层触发事件是一个用来调用代理对象的方法,触发元对象修改它指示物的行为这个具体化过程事件。在元层有很多改变是映像在基础层支持具体化原理。
我们注意到被提到的映像模型支持行为映像,它允许程序介入当前所执行。它支持结构映像,也就是说允许在编译时程序静止地改变它的数据结构。
拥有行为映像,我们能够进行并且考虑JAVA语言本身作为一个系统应用,这个系统应用的行为能够用户化:JAVA类库能够以这样的方式来被改进来适合开发者的需求。这符合元-对象方式并且基于我们应该以及能够使用“开放语言”的思想。
元-对象体系结构也许能够解释为支持面向方法方式,因为它能够很自然地展现关系分离的程度;基础层的应用核心关系从元层的非功能关系分离开来。
在Biggerstaff TJ的《Proceedings of the 7th Annual Workshop on Institutionalizing Software Reuse》一文中大多的篇幅在讨论组成库的重用问题,比如应用程序接口(API)和基础类库。扩展重用库以令人满意的性能使结构大小和特征产生变化并导致了比如特征组合问题或者缩放比例问题等的组合爆炸问题。重用库的关键问题是它们基于静态方式并由全部行为构成,比如完善和特殊化使目标程序局部化成为成为预定范围,根据扩展支持,组成库的合并爆炸的解决方法是构建所有部件和组成部分特点变化,直到运行时离开。
原文题目:Applications of dynamic proxies in distributed environments
中文题目译文:分布式环境中动态代理的应用(下)
原文作者及国籍:Youssef Hasson(英国)Roger Johnson(英国) Steve Counsell(英国)
原文出处:SOFTWARE-PRACTICE AND EXPERIENCE
正文翻译:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
分布式环境中动态代理的应用外文翻译 第8页下载如图片无法显示或论文不完整,请联系qq752018766