💬定义
责任链模式,为请求者创建一个链式的接收者,根据不同的请求判断哪个接收者来接收,这样子可以对请求者和接收者进行解耦。类似于红楼梦中的击鼓传花。
😀例子
源自(https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html)
📝这是日志的父类,设置日志的级别,通过logMessage方法来判断级别,比本级别大才去打印,每次都会从头到尾传递给每一个接收者。
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);
}
📝最低级别的接收者,给他设置的level为AbstractLogger.INFO(1)
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("控制台日志: " + message);
}
}
📝最高级别的接收者,给他设置的level为AbstractLogger.ERROR(3)
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error日志: " + message);
}
}
📝中间级别的接收者,给他设置的level为AbstractLogger.DEBUG(2)
public class FileLogger extends AbstractLogger {
public FileLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("文件日志: " + 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 = getChinOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
System.out.println("**********************************************************");
loggerChain.logMessage(AbstractLogger.DEBUG,
"This is a debug level information.");
System.out.println("**********************************************************");
loggerChain.logMessage(AbstractLogger.ERROR,
"This is an error information.");
}
}
🎥 输出:
控制台日志: This is an information.
**********************************************************
文件日志: This is a debug level information.
控制台日志: This is a debug level information.
**********************************************************
Error日志: This is an error information.
文件日志: This is an error information.
控制台日志: This is an error information.
👻灵魂
level作为等级的一个属性,每次都拿该属性进行判断,根据条件来进行操作,之后传递给它的下一个接收者。