Behavioral Patterns Part 1/11: Chain Of Responsibility Pattern
目录
Definition
通过给每一个receiver有机会来接收request的方式避免了request的sender和receiver之间的耦合。
把接收对象链(chain)起来,然后沿着chain传递request,直到有对象处理它。
A method called in one class will move up a class hierarchy until a method is found that can properly handle the call.
何时使用?希望解耦sender和receiver,也就是request发送不用指定具体的receiver。
使用频率: Medium Low
UML Class Diagram
Implementation
这里考虑一个日志(Logger)的应用——
级别高的信息要在所有比此级别低的Logger中显示。
// AbstractLogger.java
package designpatterns.behavioralpatterns.cor;
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);
}
// SpecificLogger.java
package designpatterns.behavioralpatterns.cor;
class InfoLogger extends AbstractLogger {
public InfoLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Info Console::Logger: " + message);
}
}
class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Console::Logger: " + message);
}
}
class DebugLogger extends AbstractLogger {
public DebugLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Debug Console::Logger: " + message);
}
}
// CORDemo.java
package designpatterns.behavioralpatterns.cor;
public class CORDemo {
private static AbstractLogger getChainOfLoggers() {
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(debugLogger);
debugLogger.setNextLogger(infoLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
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.");
}
}
// output
Info Console::Logger: This is an information.
=================
Debug Console::Logger: This is a debug level information.
Info Console::Logger: This is a debug level information.
=================
Error Console::Logger: This is an error information.
Debug Console::Logger: This is an error information.
Info Console::Logger: This is an error information.