原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。
责任链模式会为一个请求创建多个接收对象,每个接收对象之间互相关联,逐个处理接收到的请求。典型的应用就是SpringMVC
的HTTP
请求拦截器。比如字符编码拦截器负责请求的编码,用户认证拦截器负责验证请求是否合法,编码拦截器处理完请求交给用户认证拦截器进行处理,以此类推,直到所有拦截器全部处理完成。
举个例子
这里拿日志记录来举例,日志一般都是分级的,比如Error
,Info
,Debug
等级别,日志处理器会根据日志级别来判断此条是否该自己处理,如果不该自己处理则传递给下一个日志处理器。
来看一下UML
图:
看一下具体代码如何实现
先定义一个抽象的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
处理器,ConsoleLogger
,ErrorLogger
,以及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.");
}
}
总结
责任链模式是行为模式之一,是一个使用频率很高的设计模式,有点儿类似于领导圈阅,部门经理批完,总监批,总监批完副总批,一级一级批阅下去。具体批阅链条有多长,取决于你的请求是什么类型的。