设计模式系列——责任链模式

123 阅读2分钟

原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。

责任链模式会为一个请求创建多个接收对象,每个接收对象之间互相关联,逐个处理接收到的请求。典型的应用就是SpringMVCHTTP请求拦截器。比如字符编码拦截器负责请求的编码,用户认证拦截器负责验证请求是否合法,编码拦截器处理完请求交给用户认证拦截器进行处理,以此类推,直到所有拦截器全部处理完成。

举个例子

这里拿日志记录来举例,日志一般都是分级的,比如ErrorInfoDebug等级别,日志处理器会根据日志级别来判断此条是否该自己处理,如果不该自己处理则传递给下一个日志处理器。

来看一下UML图:

chain-of-responsibility.png

看一下具体代码如何实现

先定义一个抽象的Logger类,里面定义Logger的级别以及设置下一个处理该Logger的处理器。

public abstract class AbstractLogger {

    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;

    protected AbstractLogger nextLogger;

    public AbstractLogger getNextLogger() {
        return nextLogger;
    }
    //设置下一个Logger
    public void setNextLogger(AbstractLogger nextLogger) {
        this.nextLogger = nextLogger;
    }

    public void logMessage(int level, String message){
        if (this.level <= level){
            write(message);
        }
        if (nextLogger != null){
            nextLogger.logMessage(level,message);
        }
    }

    abstract protected void write(String message);
}

分别定义三类Logger处理器,ConsoleLoggerErrorLogger,以及FileLogger,表示将Log输出到不同的地方。

public class ConsoleLogger extends AbstractLogger {

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

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

其他两个类类似,因篇幅原因不再体现。来看一下如何使用责任链模式。

public class ChainPatternDemo {

    private static AbstractLogger getChainOfLoggers(){

        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
        AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
        AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);

        errorLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);

        return errorLogger;
    }

    public static void main(String[] args){
        //设置责任链
        AbstractLogger loggerChain = getChainOfLoggers();

        通过责任链分别处理,不同级别的日志
        loggerChain.logMessage(AbstractLogger.INFO, "This is an information");
        System.out.println("===");
        loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information.");
        System.out.println("===");
        loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");

    }
}

总结

责任链模式是行为模式之一,是一个使用频率很高的设计模式,有点儿类似于领导圈阅,部门经理批完,总监批,总监批完副总批,一级一级批阅下去。具体批阅链条有多长,取决于你的请求是什么类型的。

本文参考 www.tutorialspoint.com/design_patt…