模式定义

责任链模式为某个请求创建一个对象链。每个对象依序检查此请求,并对其处理,或者将它传给链中的下一个对象。

下图是该模式的类图:
\"责任链模式类图\"

一个生动例子

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.\");
	}
}

参考

  1. Head First 设计模式[书籍]
  2. 菜鸟教程之责任链模式
  3. csdn之责任链模式
收藏 打印