一、代理模式的原理
使用一个代理对象将目标真实对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
二、代理模式的实现
使用Java动态代理实现方法日志功能
/*
-
一个计算加减乘除的接口
*/
public interface ICalc {public int add(int a, int b);
public int div(int a, int b);
public int mul(int a, int b);
public int sub(int a, int b);
}
/* -
计算加减乘除的接口实现
*/
public class IIalImpl implements ICalc {public int add(int a, int b) {
int r = a + b;
return r;
}
public int div(int a, int b) {
int r = a - b;
return r;
}
public int mul(int a, int b) {
int r = a * b;
return r;
}
public int sub(int a, int b) {
int r = a / b;
return r;
}
}
/** - 使用java反向代理模拟日志功能
- @author user
-
/
/ -
处理器类
*/
class Handler implements InvocationHandler {Object target;
public Handler(Object target) {
this.target = target;
}
//此方法是代理对象发起对任何方法的调用都会进入这个方法
//三个参数:1.obj指代理对象本身 2.method指本次所调用的方法对象 3.args指本次所调用的方法的所有参数
//返回值与目标方法的返回值一致
public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "开始,参数是:" + Arrays.toString(args));
Object r = method.invoke(target, args);
System.out.println(method.getName() + "结束,结果是:" + r);
return r;
}
}
public class TestApp {@Test
public void testApp() {
//反向代理的步骤
//1.先创建目标对象,向上转型了
ICalc target = new IIalImpl();
//2.创建目标对象
//他需要三个参数
//类加载器:用于将类加载到内存中,实例化之前进行的步骤
ClassLoader cl = TestApp.class.getClassLoader();
//接口数组:获得真实对象保存的接口
Class[] interfaces = target.getClass().getInterfaces();
//处理器对象
Handler h = new Handler(target);
ICalc proxyObject = (ICalc) Proxy.newProxyInstance(cl, interfaces, h);proxyObject.add(1, 3); proxyObject.div(2, 5); proxyObject.mul(4, 8); proxyObject.sub(4, 2);
}
}
转载于:https://blog.51cto.com/12222886/2046151