【设计模式】责任链模式

版权声明:转载请注明出处: 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.");
	}
}

参考

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

猜你喜欢

转载自blog.csdn.net/qq_21687635/article/details/85063661