在责任链中, 发送方将请求发送到对象链。该请求可以由链中的任何对象处理。
责任链模式说, 只是“通过给多个对象一个处理请求的机会, 避免将请求的发送者耦合到其接收者”。例如, 一个ATM在资金发放过程中使用“责任链”设计模式。
换句话说, 我们可以说通常每个接收者都包含另一个接收者的参考。如果一个对象不能处理该请求, 则将其传递给下一个接收者, 依此类推。
责任链模式的优势
- 它减少了耦合。
- 在将责任分配给对象时, 它增加了灵活性。
- 它允许一组类充当一个类。一个类中产生的事件可以在组合的帮助下发送到其他处理程序类。
- 当多个对象可以处理一个请求并且处理程序未知时。
- 必须以动态方式指定可以处理请求的对象组时。
【责任链模式】让我们通过上面的UML图了解责任链模式的示例。
UML的责任链模式:
文章图片
以上UML的实现: 步骤1 创建一个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);
}
第2步 创建一个ConsoleBasedLogger类。
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类。
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);
}
}// End of the DebugBasedLogger class.
步骤4 创建一个ErrorBasedLogger类。
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);
}
}// End of the ErrorBasedLogger class.
第5步 创建一个ChainOfResponsibilityClient类。
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 occured now");
chainLogger.logMessage(Logger.DEBUGINFO, "This was the error now debugging is compeled");
}
}
输出量
bilityClient
CONSOLE LOGGER INFO: Enter the sequence of values
CONSOLE LOGGER INFO: An error is occured now
ERROR LOGGER INFO: An error is occured now
CONSOLE LOGGER INFO: This was the error now debugging is compeled
ERROR LOGGER INFO: This was the error now debugging is compeled
DEBUG LOGGER INFO: This was the error now debugging is compeled
推荐阅读
- 命令模式
- 建造者设计模式
- 桥接模式
- 行为设计模式
- 适配器模式
- 什么是.DAT文件以及如何在Windows 10中打开DAT文件()
- Android和iOS设备的12大最佳写作应用软件合集推荐
- Windows 10如何从PDF文件中提取图像(有哪些方法?)
- 供作者使用的12大最佳图书写作软件推荐合集(哪个最好用())