版权声明:转载请注明出处: https://blog.csdn.net/qq_21687635/article/details/85063661
模式定义
责任链模式为某个请求创建一个对象链。每个对象依序检查此请求,并对其处理,或者将它传给链中的下一个对象。
下图是该模式的类图:
一个生动的例子
Handler抽象类:
public abstract class AbstractLoggerHandler {
public static final int INFO = 1;
public static final int DEBUG = 2;
public static final int ERROR = 3;
protected int level;
protected AbstractLoggerHandler nextLoggerHandler;
public void setNextLoggerHandler(AbstractLoggerHandler nextLoggerHandler) {
this.nextLoggerHandler = nextLoggerHandler;
}
public void handleRequest(int level, String message) {
if (this.level <= level) {
write(message);
if (this.level < level) {
if (nextLoggerHandler != null) {
nextLoggerHandler.handleRequest(level, message);
}
}
} else {
elseWrite();
}
}
abstract protected void write(String message);
abstract protected void elseWrite();
}
Handler具体类A:
class ConsoleLoggerHandler extends AbstractLoggerHandler {
public ConsoleLoggerHandler(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Standard Console::Logger: " + message);
}
@Override
protected void elseWrite() {
System.out.println("Standard Console::Logger: 捕捉不到");
}
}
Handler具体类B:
class FileLoggerHandler extends AbstractLoggerHandler {
public FileLoggerHandler(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File::Logger: " + message);
}
@Override
protected void elseWrite() {
System.out.println("File Console::Logger: 捕捉不到");
}
}
Handler具体类C:
class ErrorLoggerHandler extends AbstractLoggerHandler {
public ErrorLoggerHandler(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Console::Logger: " + message);
}
@Override
protected void elseWrite() {
System.out.println("Error Console::Logger: 捕捉不到");
}
}
测试类:
public class LoggerHandlerTest {
public static void main(String[] args) {
AbstractLoggerHandler consoleLoggerHandler = new ConsoleLoggerHandler(AbstractLoggerHandler.INFO);
AbstractLoggerHandler fileLoggerHandler = new FileLoggerHandler(AbstractLoggerHandler.DEBUG);
AbstractLoggerHandler errorLoggerHandler = new ErrorLoggerHandler(AbstractLoggerHandler.ERROR);
consoleLoggerHandler.setNextLoggerHandler(fileLoggerHandler);
fileLoggerHandler.setNextLoggerHandler(errorLoggerHandler);
AbstractLoggerHandler loggerChainHandler = consoleLoggerHandler;
System.out.println("=== INFO ===");
loggerChainHandler.handleRequest(AbstractLoggerHandler.INFO, "This is an information.");
System.out.println();
System.out.println("=== DEBUG ===");
loggerChainHandler.handleRequest(AbstractLoggerHandler.DEBUG, "This is an debug level information.");
System.out.println();
System.out.println("=== ERROR ===");
loggerChainHandler.handleRequest(AbstractLoggerHandler.ERROR, "This is an error information.");
}
}
参考
- Head First 设计模式[书籍]
- 菜鸟教程之责任链模式
- csdn之责任链模式