责任链模式,是一种行为型的设计模式,他的设计思路是将一个请求传递给多个接收者,多个接收者之间形成一个链条,他们各自都会根据情况对请求进行处理,发送者只需要关心将请求发送给第一个接收者。每个接收者都保留了另一个接收者的引用,即使当前接收者不会处理请求,他也会把这个请求继续传给下一个接收者,直到最后一个接收者接收到请求为止。
责任链模式从名字上看,就像一个链条将消息接收者们串起来,发送者只需要将消息发送到责任链上即可,避免发送者与接收者耦合在一起。请求会沿着这个链条进行传递。
实际中的示例,比如塔罗牌,最前面的一个倒了,会影响到下一个,一直这么倒下去,直到最后一个倒下。再一个就是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.