设计模式学习—责任链模式(Chain of Responsibility Design Pattern)

本文介绍了解耦请求发送者和接收者的责任链模式。通过实例演示了如何使用责任链模式处理不同级别的日志消息,展示了其在Java编程中的具体实现。

一、我的理解


责任链模式解耦请求的发送者和接收者。将同一个请求按照一条责任链的模式传递下去,责任链上的每个接收对象都可以根据自己定制的条件处理或者不处理该请求,同时将请求传递给下一个接收对象。有点类似流水线的工作方式。该方法与过滤器有点类似,但是过滤器强调的是筛选一部分对象,它并不会将同一个请求向下传递,而责任链中是同一个请求一直在责任链中传递。

这样做的话可以解耦请求的发送方和接收方,发送方只需要将请求发送给责任链的第一个接收对象即可,该对象可以选择处理请求或者不处理请求,传递请求或者终止责任链,依次类推,一直到最后一个对象输出结果或者抛出异常。


二、实现方式


定义一个抽象类或接口,责任链中的所有对象都实现了同一个方法,并在该方法中处理请求。然后责任链中除末尾的一个接收对象外,其他对象都维护有下一个接收对象的实例,通过调用规定的方法来将请求交给下一个对象。


三、实例



Java代码


AbstractLogger.java类:统一接口,所有接收对象中调用logMessage方法来处理请求

package com.study.dp.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);

}
ConsoleLogger.java文件:

package com.study.dp.cor;

public class ConsoleLogger extends AbstractLogger {

	public ConsoleLogger(int level) {
		this.level = level;
	}
	
	@Override
	protected void write(String message) {
		System.out.println("Standard Console::Logger: "+message);
	}

}
ErrorLogger.java文件:

package com.study.dp.cor;

public class ErrorLogger extends AbstractLogger {

	public ErrorLogger(int level) {
		this.level = level;
	}
	
	@Override
	protected void write(String message) {
		System.out.println("Error Console::Logger: "+message);
	}

}
FileLogger.java文件:

package com.study.dp.cor;

public class FileLogger extends AbstractLogger {

	public FileLogger(int level) {
		this.level = level;
	}
	
	@Override
	protected void write(String message) {
		System.out.println("File::Logger: "+message);
	}

}
Demo.java文件:测试代码

package com.study.dp.cor;

public class Demo {

	private static AbstractLogger getChainOfLoggers() {
		
		AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
		AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
		AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
		
		errorLogger.setNextLogger(fileLogger);
		fileLogger.setNextLogger(consoleLogger);
		
		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.");
		System.out.println();
		
	}
	
}


四、应用实例


1.JavaScript中的事件冒泡

2.JavaWeb中Tomcat对Encoding的处理

3.JSP Servlet中的Filter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值