Chain of Responsibility 责任链模式

本文介绍了一种对象行为模式——责任链模式,详细解释了其工作原理,并通过一个日志记录系统的例子展示了如何实现多个处理类处理请求的过程。客户端无需了解具体哪个处理类处理了请求,这增加了系统的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式定义
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。责任链模式要求某个处理对象要么直接处理,要么转到下一个链处理,不允许处理一半再移交一半。 Windows操作系统的消息处理机制十分类似这种模式。 

 

使用方法
一个责任链上多个处理类各自包含了下一个处理类的对象,当当前的处理对象无法处理时,必须马上移交给下一个链上的处理对象。

 

使用范围

  • 多个处理类可以处理一个请求。
  • 客户类无须知道请求究竟被谁处理了。

 

举例说明
假设有个Logger用来记录应用程序的日志,记录普通的INFORMATION时,只在标准输出界面上显示该INFORMATION;当记录DEBUG的信息时候,将信息记录到文件;当记录ERROR信息的时候,则把信息发送到email。

abstract class Logger{
    public static int ERROR = 0;
    public static int DEBUG = 1;
    public static int INFORMATION = 2;

    protected int mask;

    // The next element in the chain of responsibility
    protected Logger next;
    public Logger setNext( Logger log)
    {
        next = log;
        return log;
    }

    abstract protected void writeMessage( int priority, String msg );

}

 

setNext()方法用来保存当前Logger链上的下一个处理对象。

以下是不同的处理类各自实现自己的处理方法,当发现无法处理请求时,马上交给链上的处理类:next.writeMessage(..)。

public class StandoutLogger extends Logger{

	protected void writeMessage(int priority, String msg) {
		if (priority == Logger.INFORMATION){
			System.out.println("Standout:" + msg);
		}else if (next!=null){ 
			next.writeMessage(priority, msg);
		}
	}
}
----------
public class FileLogger extends Logger{

	protected void writeMessage(int priority, String msg) {
		if (priority == Logger.DEBUG){
			System.out.println("File:" + msg);
		}else if (next!=null){
			next.writeMessage(priority, msg);
		}

	}
};
---------
public class EmailLogger extends Logger{

	protected void writeMessage(int priority, String msg) {
		if (priority == Logger.ERROR){
			System.out.println("Email:" + msg);
		}else if (next!=null){
			next.writeMessage(priority, msg);
		}
	}
}

 

再观察客户类,它无需知道究竟谁处理了该请求,它只关心有没有被处理。

public class Client {
	public static void main(String args[]){
		StandoutLogger log = new StandoutLogger();
		FileLogger flog = new FileLogger();
		EmailLogger elog = new EmailLogger();

		log.setNext(flog);
		flog.setNext(elog);

		log.writeMessage(Logger.DEBUG, "debug information");
	}
}

 

 

 

下载示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值