责任链模式将请求的发送者和接收者解耦,每当接收一条指令或者一个变化时,责任链上的每一个实例对象都会根据条件来做出相应的变化,责任链模式最核心的代码有两个:1.就是每个实例对象都包含有一个指向下一条实例对象的属性(protected AbstractLogger nextLogger)。2.就是每个对象在处理完当前所做的变化都会查看下一条指令是否为空,如果不为空,则调用下一个对象的通用方法(logMessage)。
因此责任链模式可以随意的在链中每一个环节增加一个新的环节,其中链的顺序的设置可以放在每一个实现类的构造方法里,也可以单独的提出一个抽象方法,然后在一个新的代码里统一的设置链的顺序。
说一些题外的东西,每个类只要实现了抽象类,就相当于每个类都独自占有抽象类的方法。
步骤1:
创建抽象的记录器类AbstractLogger。这是创建通用的的抽象方法,其中包含责任链中的下一个元素nextLogger,和调用链上的下一个对象的通用方法logMessage,通用方法为write。
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 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);
}
步骤2:
创建扩展了该记录器类的实体类。
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 ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Console::Logger: " + message);
}
}
public class FileLogger extends AbstractLogger {
public FileLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File::Logger: " + message);
}
}
步骤 3
创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。
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.");
loggerChain.logMessage(AbstractLogger.DEBUG,
"This is a debug level information.");
loggerChain.logMessage(AbstractLogger.ERROR,
"This is an error information.");
}
}
步骤 4:
执行程序,输出结果:
ConsoleLogger: this is an info message
-------------------------------------------------------------
ConsoleLogger: this is an debug message
FileLogger: this is an debug message
-------------------------------------------------------------
ConsoleLogger: this is an error message
FileLogger: this is an error message
ErrorLogger: this is an error message
-------------------------------------------------------------
这个是将责任链的下一环放到一个统一的地方管理,统一设置责任链的顺序,还可以在程序设计的时候制定好要执行的下一个任务
3个实现类都依此设置
public class ConsoleLogger extends AbstractLogger{
public ConsoleLogger() {
this.level = Level.INFO;
//指定nextLogger为FileLogger
setNextLogger(new FileLogger());
}
@Override
public void log(String message) {
System.out.println("Console logger: " + message);
}
}
main方法暴露最底层的任务既可
public class ChainPatternDemo {
public static void main(String[] args) {
/**
* 暴露最低等级既可
*/
AbstractLogger consoleLogger = new ConsoleLogger();
consoleLogger.logMegger(3, "错误信息");
System.out.println();
consoleLogger.logMegger(2, "测试信息");
System.out.println();
consoleLogger.logMegger(1, "控制台信息");
}
}
输出结果:
ConsoleLogger: this is an info message
-------------------------------------------------------------
ConsoleLogger: this is an debug message
FileLogger: this is an debug message
-------------------------------------------------------------
ConsoleLogger: this is an error message
FileLogger: this is an error message
ErrorLogger: this is an error message
-------------------------------------------------------------