代码篇 Java 实现代理模式

动态代理总结
总览
这篇文章我们简单讲一讲Java语言中代理模式的几种实现方式 。这篇文章仅仅是在代码上的实现 。原理篇会在后面分开来阐述 。
什么是代理模式
要用Java实现代理,首先要知道什么是代理 。
下面是在百度百科上关于代理模式的定义:
为其他对象提供一种代理以控制对这个对象的访问 。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 。
怎么使用代理模式
具体在Java里的实现,我们在下面三个模块代码中来阐述 。这里就简单介绍一下一个代理模式的组成,它在一定程度上表现了代理模式的基本使用 。
抽象角色:通过接口或抽象类声明真实角色实现的业务方法 。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作 。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用 。
使用代理模式的好处 职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰 。代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用 。高扩展性降低了耦合
在代理类中,我们可以添加自己的动作,不在真实角色业务逻辑中的操作我们可以在代理类中进行添加 。保证了业务逻辑的正确性 。用一个烂大街的例子 。现在我们有四个角色,一个是房东,一个是房子,一个是租客,一个是中介 。处理租客,其他三个对应的代理模式中的角色想必非常清楚 。如果租客和房东直接沟通,也就是看房->付定金->入住这样一个逻辑,但是看房和入住跟房东都没有太大的直接关系 。这个时候,如果看房、入住都让房东亲自来处理,那我们的房东必然会忙的不可开交,并且不利于我们可爱的房东从复杂的租房活动中清闲起来,这个时候,我们使用代理模式,也就是说房东找一个中介公司,把自己提供租房这个服务交给中介来代理,让他们完成租房的工作 。我们的房东只要负责收钱就好,看房啊、入住办理啊、这种事情就交给中介(代理)去处理就好 。这样,我们实现了,职责清晰、保护了目标对象、高扩展度、降低了耦合的优良形态 。
静态代理 静态代理的实现
到这里已经读了挺多字了 。这里我们上几段代码来简单讲Java中静态代理的实现 。
首先是一个接口 。也就是所谓的接口角色 。我们通过接口角色声明真实角色的业务 。
public interface Hello {void say(String name);}
然后是一个实现类 。也就是所谓的真实角色,在这个类中,我们定义所要实现的业务逻辑 。
public class HelloImp implements Hello{@Overridepublic void say(String name) {System.out.println("Hello! " + name);}}
最后是一个代理类 。我们使用代理类来代理真实类,通过真实类对应方法中的业务逻辑来实现接口中的抽象方法 。特别的是,我们可以在代理类中添加自己的操作 。
动态代理
静态代理未免有点太死板了、这么直接固定的代理方式,会导致我们每有一个新的Hello接口的实现,就需要编写一个新的代理类 。这未免也有点太臃肿了 。Java待我们很好,给我提供了两种动态代理的实现方式,一种是JDK动态代理,一种是CGLib动态代理 。JDK动态代理是Java原生的,而CGLib则是一个开源项目 。(点击下载CGLib jar包)