Design Patterns教程-责任链模式
在责任链模式中,发送者将请求发送到一系列对象中。请求可以由链中的任何对象处理。
责任链模式的定义是“通过让多个对象有机会处理请求来避免将请求的发送者与其接收者耦合”。例如,ATM机在出钞过程中使用了责任链设计模式。
换句话说,我们可以说通常每个接收者都包含另一个接收者的引用。如果一个对象不能处理请求,则将请求传递给下一个接收者,以此类推。
责任链模式的优点
- 它减少了耦合。
- 它在分配对象的责任时增加了灵活性。
- 它允许一组类作为一个整体行动;一个类中产生的事件可以通过组合发送到其他处理类。
责任链模式的使用场景
它用于:
- 当多个对象可以处理一个请求且处理者未知时。
- 当必须以动态方式指定能够处理请求的对象组时。
责任链模式示例
让我们通过上述UML图来理解责任链模式的示例。
责任链模式的UML图:
上述UML的实现:
第一步
创建一个Logger抽象类。
public abstract class Logger {
public static int OUTPUTINFO = 1;
public static int ERRORINFO = 2;
public static int DEBUGINFO = 3;
protected int levels;
protected Logger nextLevelLogger;
public void setNextLevelLogger(Logger nextLevelLogger) {
this.nextLevelLogger = nextLevelLogger;
}
public void logMessage(int levels, String msg) {
if (this.levels <= levels) {
displayLogInfo(msg);
}
if (nextLevelLogger != null) {
nextLevelLogger.logMessage(levels, msg);
}
}
protected abstract void displayLogInfo(String msg);
}
第二步
创建一个ConsoleBasedLogger类。
文件:ConsoleBasedLogger.java
public class ConsoleBasedLogger extends Logger {
public ConsoleBasedLogger(int levels) {
this.levels = levels;
}
@Override
protected void displayLogInfo(String msg) {
System.out.println("CONSOLE LOGGER INFO: " + msg);
}
}
第三步
创建一个DebugBasedLogger类。
文件:DebugBasedLogger.java
public class DebugBasedLogger extends Logger {
public DebugBasedLogger(int levels) {
this.levels = levels;
}
@Override
protected void displayLogInfo(String msg) {
System.out.println("DEBUG LOGGER INFO: " + msg);
}
} // DebugBasedLogger类的结束
第四步
创建一个ErrorBasedLogger类。
文件:ErrorBasedLogger.java
public class ErrorBasedLogger extends Logger {
public ErrorBasedLogger(int levels) {
this.levels = levels;
}
@Override
protected void displayLogInfo(String msg) {
System.out.println("ERROR LOGGER INFO: " + msg);
}
} // ErrorBasedLogger类的结束
第五步
创建一个ChainOfResponsibilityClient类。
文件:ChainofResponsibilityClient.java
public class ChainofResponsibilityClient {
private static Logger doChaining() {
Logger consoleLogger = new ConsoleBasedLogger(Logger.OUTPUTINFO);
Logger errorLogger = new ErrorBasedLogger(Logger.ERRORINFO);
consoleLogger.setNextLevelLogger(errorLogger);
Logger debugLogger = new DebugBasedLogger(Logger.DEBUGINFO);
errorLogger.setNextLevelLogger(debugLogger);
return consoleLogger;
}
public static void main(String args[]) {
Logger chainLogger = doChaining();
chainLogger.logMessage(Logger.OUTPUTINFO, "Enter the sequence of values ");
chainLogger.logMessage(Logger.ERRORINFO, "An error is occurred now");
chainLogger.logMessage(Logger.DEBUGINFO, "This was the error now debugging is completed");
}
}
输出
CONSOLE LOGGER INFO: Enter the sequence of values
CONSOLE LOGGER INFO: An error is occurred now
ERROR LOGGER INFO: An error is occurred now
CONSOLE LOGGER INFO: This was the error now debugging is completed
ERROR LOGGER INFO: This was the error now debugging is completed
DEBUG LOGGER INFO: This was the error now debugging is completed