大家比较熟悉了Java中的代理模式。而代理模式可以分为静态代理和动态代理,下面我们通过Demo来具体分析下静态代理和动态代理。
我们先实现一个计算器接口类和实现类,具体代码如下:
计算器接口类
public interface Calculator {
public int add(int x,int y);
}
实现类
public class CalculatorImpl implements Calculator {
@Override
public int add(int x, int y) {
return x+y;
}
}
静态代理
下面我们先通过静态代理模式来实现:
public class StaticProxy {
private Calculator cal;
public StaticProxy(Calculator cal){
this.cal = cal;
}
public int add(int x,int y){
int result = cal.add(x, y);
return result;
}
}
以上代码,我们通过在StaticProxy 中调用真正实现add方法得实现类来完成加法,这种方式直观方便,但是若是我们有很多类需要实现代理,那么我们就得一个类一个代理方法,以上这种方式显然不是最佳选择。这时,我们可以通过动态代理得方法,来很好的解决这一问题。
动态代理
我们先编写Loghandler类实现InvocationHandler接口
public class Loghandler implements InvocationHandler {
Object obj;
Loghandler(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doBefore();
Object o = method.invoke(obj, args);
doAfter();
return o;
}
public void doBefore(){
System.out.println("Invoke before.......");
}
public void doAfter(){
System.out.println("Invoke after........");
}
}
调用Loghandler
Calculator cal = new CalculatorImpl();
Loghandler lh = new Loghandler(cal);
Calculator proxy = (Calculator)Proxy.newProxyInstance(cal.getClass().getClassLoader(),
cal.getClass().getInterfaces(), lh);
System.out.println(proxy.add(1, 3));
通过Proxy.newProxyInstance来创建代理得方法可以为不同的委托类创建代理类,同样的代理我们只需要实现一遍,就可以为多个委托类创建代理类了。