责任链模式给请求创建了一个由接收者对象组成的链,基于请求的类型对请求的发送方和接收方进行解耦。每个接收者都包含对另一个接收者的引用,如果不能处理该请求,则把请求转发给下一个接收者继续处理。拦截的类都要实现统一的接口。责任链模式的具体应用包括Java Web中的过滤器链、js中的事件冒泡。
责任链模式的优点是降低耦合度,将请求的发送者和接收者解耦;简化了对象,对象不需要知道责任链的结构;增加新的请求处理类很方便。
责任链模式的缺点是不能 保证请求一定被接收;系统性能会受影响,可能会造成循环调用。
使用责任链模式实现日志打印:
- 创建抽象类,记录日志级别;
public abstract class AbstractLogger {
static int INFO = 1;
static int DEBUG = 2;
static int ERROR = 3;
int level;
AbstractLogger nextLogger;
//设置包含的下一个日志级别
void setNextLogger(AbstractLogger nextLogger){
this.nextLogger = nextLogger;
}
//实现日志输出
void logMessage(int level, String message){
if(this.level <= level){
write(message);
}
if(nextLogger != null){
nextLogger.logMessage(level, message);
}
}
//给子类扩展使用
protected abstract void write(String message);
}
- 创建不同级别的日志;
/**
* 控制台
*/
public class ConsoleLogger extends AbstractLogger {
ConsoleLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Standard Console::Logger:" + message);
}
}
/*
* 文件
*/
public class FileLogger extends AbstractLogger {
FileLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File::Logger:" + message);
}
}
/*
* 错误
*/
public class ErrorLogger extends AbstractLogger {
ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error::Logger:" + message);
}
}
- 设置责任链顺序,创建启动类。
public class LoggerChainInstance {
//责任链顺序:console -> file -> error
private static AbstractLogger getChainOfLoggers(){
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
fileLogger.setNextLogger(consoleLogger);
errorLogger.setNextLogger(fileLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger logger = getChainOfLoggers();
logger.logMessage(AbstractLogger.ERROR, "This is an information.");
}
}