zoukankan      html  css  js  c++  java
  • 【责任链模式】责任链模式结合Spring实战Demo

    
    
    备注:
        责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑
        主要区别在于:
        
        策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法
        
        策略模式的客户端知道所有算法以及各种算法的区别
    
    
    
    package com.gabriel.stage.design;
    
    import cn.hutool.core.collection.CollectionUtil;
    import com.gabriel.stage.common.enums.HandlerBeanEnum;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * @author: Gabriel
     * @date: 2020/3/15 23:53
     * @description 职责处理器
     */
    @Component
    public class ExecuteHandler {
    
        @Autowired
        private ApplicationContext context;
    
        private List<Handler> handlerList = new LinkedList<>();
    
        private Handler handler;
    
        public Handler getHandler() {
            return handler;
        }
    
        /**
         * 该方法会在该对象创建之后被调用
         *
         * @throws Exception
         */
        @PostConstruct
        public void afterPostConstruct() throws Exception {
            HandlerBeanEnum[] values = HandlerBeanEnum.values();
            for (HandlerBeanEnum value : values) {
                Handler bean = context.getBean(value.getBeanName(), Handler.class);
                handlerList.add(bean);
            }
            if (CollectionUtil.isNotEmpty(handlerList)) {
                for (int i = 1; i < handlerList.size(); i++) {
                    //当前处理器
                    Handler currentHandler = handlerList.get(i - 1);
                    //下一个处理器
                    Handler nextHandler = handlerList.get(i);
                    //将处理器串成链表
                    currentHandler.setNextHandler(nextHandler);
                }
                this.handler = handlerList.get(0);
            }
    
        }
    
    }
    package com.gabriel.stage.design;
    
    import org.springframework.stereotype.Component;
    
    /**
     * @author: Gabriel
     * @date: 2020/3/15 23:41
     * @description A处理器
     */
    @Component("aHandler")
    public class AHandler extends Handler {
    
        private final Integer order = 1;
    
    
        private Handler nextHandler;
    
        @Override
        public Handler getNextHandler() {
            return nextHandler;
        }
    
        @Override
        public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        public final Integer myNum = 10;
    
        @Override
        public void dealRequest(Integer num) {
            if (myNum.equals(num)) {
                System.out.println("num==10,A责任链处理");
            }else {
                //交给下一个处理器处理
                nextHandler.dealRequest(num);
            }
        }
    }
    package com.gabriel.stage.design;
    
    import lombok.Data;
    import org.springframework.stereotype.Component;
    
    /**
     * @author: Gabriel
     * @date: 2020/3/15 23:41
     * @description B处理器
     */
    @Component("bHandler")
    public class BHandler extends Handler {
    
    
        private final Integer order = 2;
    
        private  Handler nextHandler;
    
        @Override
        public Handler getNextHandler() {
            return nextHandler;
        }
    
        @Override
        public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        public final Integer myNum = 100;
    
        @Override
        public void dealRequest(Integer num) {
            if (myNum == num) {
                System.out.println("num==100,B责任链处理");
            }else {
                nextHandler.dealRequest(num);
            }
        }
    }
    package com.gabriel.stage.design;
    
    import org.springframework.stereotype.Component;
    
    /**
     * @author: Gabriel
     * @date: 2020/3/15 23:41
     * @description C处理器
     */
    @Component("cHandler")
    public class CHandler extends Handler {
    
        private final Integer order = 3;
    
        @Override
        public void dealRequest(Integer num) {
            System.out.println("num!=10 && num!=100,C责任链处理");
        }
    }
    package com.gabriel.stage.common.enums;
    
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    
    /**
     * @author: Gabriel
     * @date: 2020/3/16 14:32
     * @description 处理器Bean枚举
     */
    @Getter
    @AllArgsConstructor
    public enum HandlerBeanEnum {
    
        AHandler("aHandler"),
        BHandler("bHandler"),
        CHandler("cHandler");
    
        private String beanName;
    }
        @Autowired
        private ExecuteHandler executeHandler;
        /**
         * 测试责任链模式
         * @return
         */
        @GetMapping("/test/{num}")
        public Result testHandler(@PathVariable Integer num){
            Handler handler = executeHandler.getHandler();
            handler.dealRequest(num);
            return Result.success();
        }
  • 相关阅读:
    PowerDesigner中如何添加约束
    C#静态构造函数总结
    PendingIntent与Intent的区别
    常用编码总结
    操作系统的版本概况
    如何制作一寸、二寸、六寸证件照片
    datagridview使用tooltip控件显示单元格内容
    OpenGL ES之Must use a native order direct Buffer解决方案
    Exception.InnerException 属性的使用
    Matrix使用的分析
  • 原文地址:https://www.cnblogs.com/july-sunny/p/12505238.html
Copyright © 2011-2022 走看看