Java的动态代理模式的工作是:
给你原有的业务逻辑在不修改该逻辑代码的情况下添加新的逻辑,这个目的最直观表现便是在AOP的思想,在此暂且不讨论AOP。
Java动态代理模式的核心思想:
将你要完成的一些事情交给代理去完成,在此·使用魔乐课堂李兴华老师讲课时用到的一个例子:如果你是图书馆管理员,你主要的工作是管理书籍,但现在上头需要让你也能担当保安的责任,那么,我们可以给图书管理员设置一个代理对象--代理1,保安的责任就让这个代理去做,如果上头又需要你也担当清扫的工作,那么,我们可以再设置一个代理对象:代理2,清扫的工作就交给代理2去做。我想,说这里,该明白的人也都名白了,代理模式就是将你要做的一些事分给一个你的代理去完成。
动态代理模式所必须的3个条件:
1、被代理对象——图书馆管理员
2、可执行者(代理的工作类/接口)——保安/清扫的工作
3、代理类——图书管理员的代理
接下来,我们以上述例子为例,讲解代理模式
首先,我们需要声明一个接口,即被代理对象需要去实现的接口,该接口的直接作用提供在获取动态代理对象的时候需要传入代理对象的类实现的接口对象。
public interface Manager {
void manage();
}
然后写被代理对象,要求被代理对象实现上面的接口
import com.cen.dao_interface.Manager;;
public class LibraryManager implements Manager {
@Override
public void manage() {
System.out.println("在管理图书!");
}
}
再写好要添加的工作类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class BaoAnHandler implements InvocationHandler {
Object object;
/**
* 构造方法,用于接收传递过来的被代理对象
* @param o
*/
public BaoAnHandler(Object o) {
this.object = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object resultObject;
resultObject=method.invoke(object, args);
baoAn();//调用新增加的方法
return resultObject;
}
public void baoAn() {
System.out.println("在做安保!");
}
}
注意,该类必须要实现InvocationHandler接口,并且在invoke方法内将要添加的工作逻辑调用。
最后写获取代理类对象的方法实现:
@Test
public void test_HelloWordProxy3() throws Exception {
//一个被代理对象
Manager manager = new LibraryManager();
//一个可执行者,即添加的逻辑
InvocationHandler invocationHandler = new BaoAnHandler(manager);
//一个代理
Manager proxy = (Manager) Proxy.newProxyInstance(manager.getClass()
.getClassLoader(), manager.getClass().getInterfaces(),
invocationHandler);
//调用代理的方法
proxy.manage();
}
到此,一个简单的设计模式的例子就完成了,需要读者注意的是,在JDK中Proxy与InvocationHandler的实现原理其实也不难,主要应用的是编译器类与Java的反射机制实现,在这里就不做阐述,因为我自己都写不出来··呵呵··