您好,欢迎来到年旅网。
搜索
您的当前位置:首页代理模式在Java中的应用

代理模式在Java中的应用

来源:年旅网
代理模式在Java中的应用

解志君

【摘 要】Through expounding the conception,structure,type,application context of proxy pattern,and it’s method of use in Java program,pointed out that it is key to understand proxy pattern deeply for studying the open source framework program of J2EE.%通过阐述代理模式的概念、结构、类型、应用环境以及在Java[1]中的使用方法,指出深入理解代理模式对学习J2EE开源框架编程是至关重要的。 【期刊名称】《软件》 【年(卷),期】2014(000)005 【总页数】4页(P94-96,101)

【关键词】设计模式;动态代理;静态代理 【作 者】解志君

【作者单位】常州信息职业技术学院 江苏常州 2131 【正文语种】中 文 【中图分类】TP311

代理,意即一个角色代表另一个角色来完成某些特定的功能或任务。在日常生活中,代理的例子不胜枚举,比如商品的销售代理,明星的经纪人,企业的业务代理等等。一般地,代理具有以下优点:一是委托方可以将自己有限的资源投入到自己的核心业务上,加快新产品的研发进度,从而更好地满足消费者的需求,而一些附属业务

则可以交给代理方来完成;二是省去了亲自开拓市场的麻烦,让当地的代理人去开拓当地市场,充分利用了代理人在当地的各种资源,既提升了自己产品的知名度,又扩大了市场占有率;三是可以极大地激发代理商的热情,在销售产品的同时创造性地给顾客提供一些额外的服务,提高商品的附加值,增加代理商的利润。Java从这种模式中受到启发,将这种代理的模式应用到面向对象程序设计中。下面将深入探讨Java中代理模式的应用。

代理模式属于设计模式中结构化模式的一种。在设计模式中是这样定义代理模式的:为其它对象提供一个代理对象,并使用代理对象来控制对原对象的访问。说得更清楚一点,就是在一些情况下已有对象提供的服务不能直接应用于当前的问题环境中,或者不想让访问者直接访问现有对象,这时可以为该对象建立一个代理对象,这样客户程序就可以通过代理对象来访问该对象,代理对象就成了客户程序和目标对象之间的中介。在代理对象中可以对真实对象已有的服务进行适应性修改,还可以在原对象的业务方法执行前后增加特定的服务性代码,使得服务更加人性化[2]。 代理模式中的代理对象要为真实对象提供代理,就必须和被代理的对象使用相同的业务规范模式。在Java中,这个相同的业务规范模式可以用Java中的接口来实现。一般地在代理模式中需要包含三种角色,它们分别是:

①抽象角色:定义了真实角色和代理角色共同遵守的业务规范,即接口。 ②真实角色:定义了需要通过代理访问的真实对象。

③代理角色:它是为真实角色提供代理服务的对象,它和真实角色都实现了抽象角色中定义的接口[3]。代理模式的结构如图1所示。

代理模式可以分为静态代理和动态代理。所谓静态代理,是指需要代理的真实角色和代理角色都是事先定义好的,并且真实角色与代理角色之间是一对一的关系。这样,如果一个程序中有很多真实角色需要代理,就会导致类绝对数量的增加;静态代理的另一个缺点则是,真实角色和代理角色之间的代理关系是固定的,不能在程

序运行过程中动态改变和调整。因此,相应的有动态代理的概念。

在动态代理中,代理角色是在程序运行时利用Java机制[4]动态创建的。可以在运行时动态改变被代理的角色,改变代理的接口以及控制代理的方式,实现了一种非常灵活的代理关系。下面通过一个简单的例子来说明。

下面的例子在调用真实方法的前后显示必要的日志追踪信息,为了不破坏真实方法的完整性,采用动态代理实现。 5.1 抽象角色定义 5.2 真实角色定义 5.3 代理角色定义

在代理角色的定义中,并非直接声明代理角色类,而是声明一个代理处理类ProxyHandler,然后由这个代理处理类来动态创建代理角色类,并且这个代理处理类必须实现InvocationHandler接口,并实现其中的invoke方法,因为该方法是真正实现代理功能的方法,该方法的第一个参数proxy是指发生方法调用的代理对象,第二个参数method是要调用的真实对象的方法名,第三个参数Object数组里保存调用真实方法需要的参数。然后通过method.invoke(realObj,args)来调用真实角色类的相应方法,其实这句代码就相当于realObj.method(args)。在这里需要特别指出一点,就是这里的invoke方法是Method类对象的invoke方法,并非ProxyHandler类的invoke方法。最后,ProxyHandler类的invoke方法返回真实方法的返回值;代理处理类的bind方法返回了动态创建的代理对象,而代理对象则是通过Proxy类的newProxyInstance()方法获得的,这个方法的第一个参数给出了该代理类的类加载器,第二个参数给出了这个代理类所实现的接口(其实就是AbstractRole接口),第三个参数则是实现了InvocationHandler接口的子类实例[5]。 5.4 主程序

在主程序中,首先创建了真实角色类对象msg和代理处理类对象ProxyHandler,然后调用ProxyHandler对象的bind方法返回了动态创建的代理对象msgProxy,接着调用了代理对象msgProxy的output方法,此时,程序会自动回调ProxyHandler类的invoke方法,从而实现在调用真实角色的业务方法output的前后插入一些服务性功能代码。

这样,通过动态代理,可以在调用真实方法的前后做一些日志记录等类似的任务,以便于跟踪程序的运行状态,并不用把实现这些功能的代码写入真实方法中,实现了业务代码与服务性代码的分离,而这正是动态代理的精髓之处[6]。

当在解决实际问题的时候,有时候需要使用前人已经发现的思路或方法,但在多数情况下,完全照搬别人的方法又不能很好的满足自己的实际需要,这时就需要对原有的思路或方法进行改进以适应问题的变化。改进的方法有两种,一是破坏式地对原有方法进行修改;二是保持原有方法的完整性,以一种第三方的姿态来调用原有方法中的功能并能对原有方法产生的结果进行一定的控制,使之符合自己的需要。第一种方法显然违背了软件开发的一个重要原则,就是“对扩展开放、对修改关闭”的开闭原则。所以第二种方法是一种比较好的处理方式,它能够使原有的功能与附加的功能清晰地分离开来,并没有对原有方法造成破环,这是符合软件的可重用原则的,在这里的第二种方法,其实就是代理模式在实际软件开发中的应用。 代理模式在软件开发[7]中有着广泛的应用,它能够协调代理对象和真实对象之间的关系,在一定程度上降低了系统的耦合度,提高了代码的可复用性以及系统的可扩展性和可维护性[5]。例如Hibernate中的延迟加载、Spring中的IOC与AOP[8]、还有RMI与CORBA等的实现中都大量用到了代理模式的设计思想。深刻理解代理模式,是进入J2EE[9]开源框架编程殿堂的钥匙。

【相关文献】

[1] 田平.Java Web 开发的环境配置[J].软件,2013,34(7):40 [2] 程杰.大话设计模式[M].北京:清华大学出版社,2005:57-65

[3] 崔行臣.代理软件设计模式及其应用研究[J].山东广播电视大学学报,2012(3):66 [4] 武鹏.Java类中的私有成员的继承机制[J].软件,2012,33(9):106-108 [5] 良葛格.Java学习笔记[M].北京:清华大学出版社,2007:372-385

[6] 王越超等.探讨软件设计模式背后的科学方法与科学哲学[J].广州城市职业学院学报,2010,4(1):49

[7] 陈妍.计算机软件开发的规范化探析[J].软件,2013,34(7):33-34

[8] 王小民等.结合AOP与反射机制动态改变软件的行为[J].计算机科学,2007,34(11):274-278

[9] 郑阿奇等.J2EE应用实践教程[M].北京:电子工业出版社,2009:170-177

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务