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.javapackage 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.javapackage 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.javapackage 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."); }}// outputInfo 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.