设计模式之责任链模式(Java实现)

责任链模式是一种行为型设计模式,通过将请求沿着一系列处理者组成的链进行传递,避免了发送者与接收者之间的直接耦合。本文介绍了责任链模式的概念、优缺点及应用示例,如塔罗牌效应、Struts2的拦截器机制。

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

    责任链模式,是一种行为型的设计模式,他的设计思路是将一个请求传递给多个接收者,多个接收者之间形成一个链条,他们各自都会根据情况对请求进行处理,发送者只需要关心将请求发送给第一个接收者。每个接收者都保留了另一个接收者的引用,即使当前接收者不会处理请求,他也会把这个请求继续传给下一个接收者,直到最后一个接收者接收到请求为止。

    责任链模式从名字上看,就像一个链条将消息接收者们串起来,发送者只需要将消息发送到责任链上即可,避免发送者与接收者耦合在一起。请求会沿着这个链条进行传递。

    实际中的示例,比如塔罗牌,最前面的一个倒了,会影响到下一个,一直这么倒下去,直到最后一个倒下。再一个就是struts2的拦截器,javascript的事件冒泡机制等。

    责任链模式的缺点是链条如果太长,会影响系统性能,排错debug困难。

下面给出一个简单的示例,帮助我们了解责任链模式:

接口 Handler.java

package com.xxx.design.chain;

public interface Handler {
	void action();
}

抽象类 AbstractHandler.java

package com.xxx.design.chain;

public abstract class AbstractHandler {
	Handler handler;
	
	public Handler getHandler() {
		return handler;
	}
	
	public void setHandler(Handler handler) {
		this.handler = handler;
	}
}

具体实现类 EventHandler.java

package com.xxx.design.chain;

public class EventHandler extends AbstractHandler implements Handler {
	
	private String name;
	
	public EventHandler(String name) {
		// TODO Auto-generated constructor stub
		this.name = name;
	}

	@Override
	public void action() {
		System.out.println("handler ["+name + "] -> called.");
		if(getHandler()!=null){
			getHandler().action();
		}
	}

	public static void main(String[] args) {
		EventHandler doubleClickHandler = new EventHandler("doubleclick event");
		EventHandler clickHandler = new EventHandler("click event");
		EventHandler mouseHandler = new EventHandler("mouse event");
		
		doubleClickHandler.setHandler(clickHandler);
		clickHandler.setHandler(mouseHandler);
		
		doubleClickHandler.action();
	}
}

这里模拟一个双击事件,事件类型构成的链条依次是双击事件,单击事件,鼠标事件。运行程序,控制台打印信息如下:

handler [doubleclick event] -> called.
handler [click event] -> called.
handler [mouse event] -> called.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值