当一个对象在一条链上把多个拦截器处理时,我们把这种设计模式称为责任链模式。责任链模式 同样是对jdk动态代理的应用。如何编写一个简单的责任链实例?
首先定义Interceptor接口
该接口规定了在调用目的方法之前的处理,同时返回boolean代表是否调用目的方法。 还有调用之后的方法处理。
定义接口后便可以加入自己想要的实现了。这里可以有多个实现从而可以对同一个对象的一个方法进行多次拦截。那么这个过程还没写 怎么实现呢?答案是:动态代理
你应该书写这样一个类:该类实现InvocationHandler接口,实现其invoke方法,同时定义类变量 1、被代理对象 2、拦截器的name(全限定名)。同时定义绑定方法(即把被代理对象绑定到代理对象上)bind(Object target,String interceptorClazz)返回代理对象。类似Proxy.newInstance(classLoader,Interfaces,new ClassName(target,”拦截器的全限定名”));同时 在invoke方法中同时利用反射获取到 拦截器类,从而判断是否调用method.Invoke()以及加入拦截器的拦截方法。
public interface Interceptor {
public boolean before(Object proxy, Object target, Method method, Object[] args);
public void around(Object proxy, Object target, Method method, Object[] args);
public void after(Object proxy, Object target, Method method, Object[] args);
}
public class MyInterceptor1 implements Interceptor {
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("before interceptor 1..............");
return true;
}
public void around(Object proxy, Object target, Method method, Object[] args) {
}
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("after interceptor 1..............");
}
}
public class MyIntercetor implements Interceptor {
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("before interceptor 0..............");
return true;
}
public void around(Object proxy, Object target, Method method, Object[] args) {
System.out.println("取消原有方法的逻辑");
}
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("after interceptor 0..............");
}
}
public class JDKDynamicProxy implements InvocationHandler {
public Object object;
public String interceptorClazz;
public JDKDynamicProxy(Object object, String interceptorClazz) {
this.object = object;
this.interceptorClazz = interceptorClazz;
}
public static Object bind(Object object,String interceptorClazz){
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
new JDKDynamicProxy(object,interceptorClazz));
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(interceptorClazz==null){
method.invoke(object,args);
}
Object result = null;
Interceptor interceptor = (Interceptor) Class.forName(interceptorClazz).newInstance();
if(interceptor.before(proxy,object,method,args)){
result = method.invoke(object,args);
}else{
interceptor.around(proxy,object,method,args);
}
interceptor.after(proxy,object,method,args);
return result;
}
}