责任链模式进行参数校验

119 阅读1分钟
  1. 定义模板handler

    package com.zj.study.xx;
    ​
    /**
     * @author Zpain
     * @date 2023/6/25 16:08
     */
    public abstract class Handler<T> {
    ​
        protected Handler<T> next;
    ​
        public void setNext(Handler<T> next) {
            this.next = next;
        }
    ​
        /**
         * 执行任务
         * @param a
         */
        public abstract void doHandler(T a);
    ​
        public static class Builder<T> {
            private Handler<T> head;
            private Handler<T> tail;
    ​
            public Builder<T> addHandler(Handler<T> handler) {
                if (this.head == null) {
                    this.head = handler;
                    this.tail = handler;
                    return this;
                }
                this.tail.setNext(handler);
                this.tail = handler;
                return this;
            }
    ​
            public Handler<T> build() {
                return this.head;
            }
        }
    ​
    }
    ​
    
  2. 定义执行计划

    package com.zj.study.xx;
    ​
    /**
     * @author zhangjun
     * @date 2023/6/25 16:14
     */
    public class Ahandler<T> extends Handler<T> {
        @Override
        public void doHandler(T a) {
            if (!"a".equals(a)) {
                System.out.println("a error");
                return;
            }
            if (null != next) {
                next.doHandler(a);
            }
        }
    }
    ​
    
    package com.zj.study.xx;
    ​
    /**
     * @author zhangjun
     * @date 2023/6/25 16:14
     */
    public class Bhandler<T> extends Handler<T> {
        @Override
        public void doHandler(T b) {
            if (!"b".equals(b)) {
                System.out.println("b error");
                return;
            }
            if (null != next) {
                next.doHandler(b);
            }
        }
    }
    ​
    
    package com.zj.study.xx;
    ​
    /**
     * @author zhangjun
     * @date 2023/6/25 16:14
     */
    public class Chandler<T> extends Handler<T> {
        @Override
        public void doHandler(T c) {
            if (!"a".equals(c)) {
                System.out.println("c error");
                return;
            }
            if (null != next) {
                next.doHandler(c);
            }
        }
    }
    ​
    
    package com.zj.study.xx;
    ​
    /**
     * @author zhangjun
     * @date 2023/6/25 16:14
     */
    public class Dhandler<T> extends Handler<T> {
        @Override
        public void doHandler(T d) {
            System.out.println("ok");
        }
    }
    ​
    
  3. 最终执行

       Handler.Builder<String> builder = new Handler.Builder<>();
            Handler.Builder<String> builder1 = builder.addHandler(new Ahandler<String>())
                    .addHandler(new Bhandler<String>())
                    .addHandler(new Chandler<String>())
                    .addHandler(new Dhandler<String>());
            builder1.build().doHandler("a");
    
  4. 注入Spring

    package com.zj.study.yyy;
    ​
    import com.zj.study.A;
    import com.zj.study.B;
    ​
    /**
     * @author Zpain
     * @date 2023/6/25 16:08
     */
    public interface Handler2 {
        /**
         * 执行任务
         *
         * @param b
         */
        B doHandler(B b);
    ​
    ​
    }
    ​
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class B {
        private int id;
        private int num;
    }
    
  5. 定义执行计划

    package com.zj.study.yyy;
    ​
    import com.zj.study.B;
    import org.springframework.stereotype.Service;
    ​
    /**
     * @author Zpain
     * @date 2023/6/25 16:53
     */
    @Service
    public class AaHandler implements Handler2 {
    ​
        /**
         * 执行任务
         *
         * @param b
         */
        @Override
        public B doHandler(B b) {
            if (b.getId() < 10) {
                throw new RuntimeException("id error");
            }
            return b;
        }
    }
    ​
    
    package com.zj.study.yyy;
    ​
    import com.zj.study.B;
    import org.springframework.stereotype.Service;
    ​
    /**
     * @author Zpain
     * @date 2023/6/25 16:53
     */
    @Service
    public class BbHandler implements Handler2 {
    ​
        /**
         * 执行任务
         *
         * @param b
         */
        @Override
        public B doHandler(B b) {
            if (b.getNum() < 10) {
                throw new RuntimeException("num error");
            }
            return b;
        }
    }
    ​
    
    package com.zj.study.yyy;
    ​
    import com.zj.study.B;
    import org.springframework.stereotype.Service;
    ​
    /**
     * @author Zpain
     * @date 2023/6/25 16:53
     */
    @Service
    public class CcHandler implements Handler2 {
    ​
        /**
         * 执行任务
         *
         * @param b
         */
        @Override
        public B doHandler(B b) {
            System.out.println("ok");
            return b;
        }
    }
    ​
    
  6. 注入到Spring中

    package com.zj.study.yyy;
    ​
    import com.zj.study.B;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    ​
    import java.util.ArrayList;
    import java.util.List;
    ​
    /**
     * @author Zpain
     * @date 2023/6/25 17:15
     */
    @Component
    public class HandlerAdaptor {
        @Autowired
        private List<Handler2> list;
    ​
        public B execute(B b) {
            for (Handler2 handleIntercept : list) {
                b = handleIntercept.doHandler(b);
            }
            return b;
        }
    ​
    }
    ​
    
  7. 最终执行

     @Autowired
        private HandlerAdaptor adaptor;
    ​
        @Test
        public void get3() {
            B b = new B(10, 10);
            B execute = adaptor.execute(b);
            log.info("b:{}", JSON.toJSONString(execute));
        }
    

    如果想要执行顺序 自行定义 sort或者@Order,或者实现Ordered方式