简述
- 前面我们了解过动态代理模式以及如何自定义拦截器,但是当拦截器存在多个的时候该如何处理呢?
- 当你要请假时,请假单需要经过项目经理、部门经理、人事等等人的审批或修改,这些就是多个拦截器,每个拦截器都有自己的逻辑
- 当一个对象在一条链上被多个拦截器拦截处理时(拦截器也可以选择不拦截它),我们把这样的设计模式称为责任链模式,它用于一个对象在多个角色中传递的场景。
- 通常可以按顺序设置多个拦截器,然后把上一个拦截器生成的代理对象作为下一个拦截器的真实对象
代码示例
【拦截器1】
import com.bpf.chapter2.proxy.interceptor.Interceptor;
import java.lang.reflect.Method;
public class Interceptor1 implements Interceptor {
@Override
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器1的before方法");
return true;
}
@Override
public void around(Object proxy, Object target, Method method, Object[] args) {
}
@Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器1的after方法");
}
}
【拦截器2】
import com.bpf.chapter2.proxy.interceptor.Interceptor;
import java.lang.reflect.Method;
public class Interceptor2 implements Interceptor {
@Override
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器2的before方法");
return true;
}
@Override
public void around(Object proxy, Object target, Method method, Object[] args) {
}
@Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器2的after方法");
}
}
【拦截器3】
import com.bpf.chapter2.proxy.interceptor.Interceptor;
import java.lang.reflect.Method;
public class Interceptor3 implements Interceptor {
@Override
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器3的before方法");
return true;
}
@Override
public void around(Object proxy, Object target, Method method, Object[] args) {
}
@Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("拦截器3的after方法");
}
}
【测试】
import com.bpf.chapter2.proxy.interceptor.InterceptorJdkProxy;
import com.bpf.chapter2.proxy.jdkProxy.HelloWorld;
import com.bpf.chapter2.proxy.jdkProxy.HelloWorldImpl;
public class TestProxy {
public static void main(String[] args) {
HelloWorld proxy1 = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(),
"com.bpf.chapter2.proxy.chain_of_responsibility.Interceptor1");
HelloWorld proxy2 = (HelloWorld) InterceptorJdkProxy.bind(proxy1,
"com.bpf.chapter2.proxy.chain_of_responsibility.Interceptor2");
HelloWorld proxy3 = (HelloWorld) InterceptorJdkProxy.bind(proxy2,
"com.bpf.chapter2.proxy.chain_of_responsibility.Interceptor3");
proxy3.sayHelloWorld();
}
}
【结果】
运行结果
网友评论