前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、ChainOfReponsibility责任链模式

1.1、解释

场景:假设现在我们去公司领取资料。

1、首先我们向公司前台打听要去哪里领取资料,她告诉我们应该去“营业窗口”。

2、然后等我们到了“营业窗口”后,又被告知应该去“售后部门”。

3、等我们好不容易赶到了“售后部门”,

4、又被告知应该去“资料中心”,

5、因此最后我们又不得不赶到“资料中心”。

像这样,在找到合适的办事人之前,我们被不断地赐给一个有一个人,这就是“推卸责任”。

真实项目中,其实我也有使用过,在小米金融科技,接触的供应链项目,FlowNode流程,用到过,我们是讲Json挨个传递,直到每个节点处理完成。具体可以到的博客中翻找案例代码,绝对是好项目

1.2、示例代码

1.2.1、抽象父类节点AbstractLogger

package com.hlj.moudle.design.D06访问数据结构.D14ChanOfResponsibility责任链模式;

/**
 * @author HealerJean
 * @ClassName AbstractLogger
 * @date 2019/8/16  15:54.
 * @Description 创建抽象的记录器类。
 */
public abstract  class AbstractLogger {

    /**
     * 级别 error 是最高级别3
     */
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;

    /**
     * 责任链中的下一个元素
     */
    protected AbstractLogger nextLogger;


    public void setNextLogger(AbstractLogger nextLogger){
        this.nextLogger = nextLogger;
    }

    /**
     * 输入的基本级别如果跟当前级别比较,如果比当前级别大,则肯定打印,
     * 傻瓜 error肯定会打印 info
     */
    public void log(int level, String message){
        if(this.level <= level){
            write(message);
        }
        if(nextLogger !=null){
            nextLogger.log(level, message);
        }
    }

    abstract protected void write(String message);

}

1.2.1.1、Error级别


public class ErrorLogger extends AbstractLogger {

    public ErrorLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Error : " + message);
    }
}

1.2.1.2、Info级别

public class InfoLogger extends AbstractLogger {

    public InfoLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("info : " + message);
    }
}

1.2.1.3、Debug级别

public class DebugLogger extends AbstractLogger {

    public DebugLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Debug : " + message);
    }
}

1.2.2、测试

package com.hlj.moudle.design.D06访问数据结构.D14ChanOfResponsibility责任链模式;


public class Main {

    private static AbstractLogger getChainOfLoggers(){
        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
        AbstractLogger infoLogger =  new InfoLogger(AbstractLogger.INFO);
        errorLogger.setNextLogger(infoLogger);

        AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
        infoLogger.setNextLogger(debugLogger);

        return errorLogger;
    }

    public static void main(String[] args) {
        AbstractLogger loggerChain = getChainOfLoggers();

        loggerChain.log(AbstractLogger.ERROR, " error message");
        // Error :  error message
        // info :  error message
        // Debug :  error message


        loggerChain.log(AbstractLogger.INFO, "info message");
        // info : info message
        // info :  debug message

        loggerChain.log(AbstractLogger.DEBUG, " debug message ");
        // Debug :  debug message


    }
}