spring版责任链模式

责任链模式顾名思义就是。执行一串业务处理,像链子一样,从上向下,一个节点一个节点有序执行,中间任何一个节点挂啦,链子就断了,不会继续向下执行

实现思路就是把一个个处理器类放到一个数组list中,遍历数组,从第一个到末尾一个个执行 handle 方法,数组list就是一个链子,一个个对象的处理方法就是责任,合起来就是责任链咯!

import org.springframework.lang.Nullable;

/**
 * 描述: 业务处理顶级拦截器接口 </br>
 * 时间: 2021-03-02 14:46  </br>
 * 作者:IT学习道场
 */
public interface HandleIntercept {
    /**
     * 业务顶级接口处理接口
     * @param model 泛型参数
     * @return 成功的对象返回,可以是boolean,string,model
     */
    Object handle(@Nullable Object model);
}
第一个业务处理拦截器
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 描述: 第一个业务处理拦截器 </br>
 * 时间: 2021-03-02 14:57  </br>
 * 作者:IT学习道场
 */
@Order(2)
@Component
public class FirstHandleIntercept implements HandleIntercept {

    @Override
    public Object handle(Object model) {
        System.out.println("========执行 firstHandleIntercept 开始业务处理 =======");
        return true;
    }
}
第二业务处理器
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 描述: 第二业务处理器 </br>
 * 时间: 2021-03-02 15:02  </br>
 * 作者:IT学习道场
 */
@Order(1)
@Component
public class SecondHandleIntercept implements HandleIntercept {
    @Override
    public Object handle(Object model) {
        System.out.println("========执行 SecondHandleIntercept =======");
        return true;
    }

}
第三业务处理器
import org.springframework.stereotype.Component;

/**
 * 描述: 第二业务处理器 </br>
 * 时间: 2021-03-02 15:02  </br>
 * 作者:IT学习道场
 */
//@Order(1)
@Component
public class ThirdHandleIntercept implements HandleIntercept {
    @Override
    public Object handle(Object model) {
        System.out.println("========执行 ThirdHandleIntercept =======");
        return true;
    }

}
业务处理器门面入口






import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 描述: 业务处理器门面入口 </br>
 * 时间: 2021-03-02 15:05  </br>
 * 作者:IT学习道场
 */
@Component
public class HandleInterceptEntrance {

    @Autowired
    private Map<String, HandleIntercept> HandleInterceptBeanMap = new ConcurrentHashMap<>();
    //业务链式处理器list
    private static List<HandleIntercept> HandleInterceptList = new ArrayList<>();

    /**
     * 链式处理入口,类似门面
     */
    public void handleEntrance() {
        if (CollectionUtils.isEmpty(HandleInterceptList)){
            getHandleInterceptList ();
        }
        for (HandleIntercept handleIntercept : HandleInterceptList) {
            //要注入参数,可以在此处理
            handleIntercept.handle(null);
        }

    }

    /**
     * 处理拦截器拍寻,解决order排序不生效问题
     * 并把HandleIntercept注入到HandleInterceptList中
     */
    @PostConstruct
    private synchronized void getHandleInterceptList () {
        //存贮不带order注解的拦截器容器list
        List<HandleIntercept> noOrderHandleInterceptList = new ArrayList<>();
        //存贮带order注解的拦截器容器list
        List<HandleIntercept> orderHandleInterceptList = new ArrayList<>();
        //处理HandleIntercept的springioc容器中的HandleIntercept,处理到
        //noOrderHandleInterceptList和orderHandleInterceptList
        for (String beanName : HandleInterceptBeanMap.keySet()) {
            HandleIntercept handleIntercept = HandleInterceptBeanMap.get(beanName);
            //获取order注解
            Order order = handleIntercept.getClass().getAnnotation(Order.class);
            if (ObjectUtils.isEmpty(order)){
                noOrderHandleInterceptList.add(handleIntercept);
            }else {
                orderHandleInterceptList.add(handleIntercept);
            }
        }
        //对orderHandleInterceptList进行oder注解的value值升序排列
        if (!CollectionUtils.isEmpty(orderHandleInterceptList)){
            Collections.sort(orderHandleInterceptList, new Comparator<HandleIntercept>() {
                @Override
                public int compare(HandleIntercept h1, HandleIntercept h2) {
                    //升序
                    Integer value1 = h1.getClass().getAnnotation(Order.class).value();
                    Integer value2 = h2.getClass().getAnnotation(Order.class).value();
                    return value1.compareTo(value2);
                }
            });
        }
        //优先orderHandleInterceptList注入HandleInterceptList
        HandleInterceptList.addAll(orderHandleInterceptList);
        HandleInterceptList.addAll(noOrderHandleInterceptList);
    }

}
使用示例demo

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping("/test")
public class HandleController {

    @Autowired
    private HandleInterceptEntrance handleEntrance;

    @GetMapping("/handleEntrance")
    public void test() {
        handleEntrance.handleEntrance();
    }


}
责任链模式顾名思义就是。执行一串业务处理,像链子一样,从上向下,一个节点一个节点有序执行,中间任何一个节点挂啦,链子就断了,不会继续向下执行

实现思路就是把一个个处理器类放到一个数组list中,遍历数组,从第一个到末尾一个个执行 handle 方法,数组list就是一个链子,一个个对象的处理方法就是责任,合起来就是责任链咯!

其实这里面包含了,工厂模式,单例模式。门面模式和责任链综合使用,很多情况都是多种模式配合使用

看明白后,要自己动手玩玩吧,自己写,不要抄,实在搞不定,再看看,不要copy,使用场景需要一连串的不同的业务处理的操作场景,可以考虑责任链,经典场景:ip很名单处理 ->登录处理 -> 权限处理等类似不同处理维度的连续不间断处理,考虑责任链






作者:IT学习道场

欢迎关注微信公众号 : IT学习道场