个性化阅读
专注于IT技术分析

责任链模式

在责任链中, 发送方将请求发送到对象链。该请求可以由链中的任何对象处理。

责任链模式说, 只是“通过给多个对象一个处理请求的机会, 避免将请求的发送者耦合到其接收者”。例如, 一个ATM在资金发放过程中使用“责任链”设计模式。

换句话说, 我们可以说通常每个接收者都包含另一个接收者的参考。如果一个对象不能处理该请求, 则将其传递给下一个接收者, 依此类推。


责任链模式的优势

  • 它减少了耦合。
  • 在将责任分配给对象时, 它增加了灵活性。
  • 它允许一组类充当一个类。一个类中产生的事件可以在组合的帮助下发送到其他处理程序类。

责任链模式的用法:

它用于:

  • 当多个对象可以处理一个请求并且处理程序未知时。
  • 必须以动态方式指定可以处理请求的对象组时。

责任链模式的例子

让我们通过上面的UML图了解责任链模式的示例。

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
赞(0)
未经允许不得转载:srcmini » 责任链模式

评论 抢沙发

评论前必须登录!