【责任链模式】责任链模式结合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();
    }

 

posted @ 2020-03-16 17:30  听风是雨  阅读(5029)  评论(0编辑  收藏  举报
/* 看板娘 */