美文网首页
Java设计模式之责任链模式

Java设计模式之责任链模式

作者: BestbpF | 来源:发表于2018-08-21 21:46 被阅读19次

    简述

    • 前面我们了解过动态代理模式以及如何自定义拦截器,但是当拦截器存在多个的时候该如何处理呢?
    • 当你要请假时,请假单需要经过项目经理、部门经理、人事等等人的审批或修改,这些就是多个拦截器,每个拦截器都有自己的逻辑
    • 当一个对象在一条链上被多个拦截器拦截处理时(拦截器也可以选择不拦截它),我们把这样的设计模式称为责任链模式,它用于一个对象在多个角色中传递的场景。
    • 通常可以按顺序设置多个拦截器,然后把上一个拦截器生成的代理对象作为下一个拦截器的真实对象

    代码示例

    1. 本示例代码中使用的拦截器接口和动态代理逻辑可到自定义拦截器下载
    2. 所示代码可到责任链模式中去下载

    【拦截器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();
        }
    }
    

    【结果】


    运行结果

    相关文章

      网友评论

          本文标题:Java设计模式之责任链模式

          本文链接:https://www.haomeiwen.com/subject/ewdsiftx.html