责任链模式里面的很多对象对其下家的引用而形成一条连锁,请求在这个链条上传递,直到被处理完毕,而客户端并不知道链条上哪个链接点处理了这个事件。开发 Web 项目的时候,过滤器就是这样工作的,过滤器互相嵌套,一个接着一个处理请求。这个好处就是在客户端不在意的情况下动态处理连接点以及分配任务。
按照惯例,先上 UML 类图
- Handler :抽象处理角色,定义一个处理请求的接口,可以设定返回下家的引用;
- ConcreteHandler:具体处理角色,接收到请求的具体处理者,可以选择处理也可以不处理,把请求传递下一个连接点。
看下具体的代码:
先把抽象处理者写出来,他是一个抽象类或者接口,这里使用抽象类,每个处理者给一个名字 name 属性
public abstract class Handler {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Handler(String name) {
this.name=name;
}
protected Handler handler;
public Handler getHandler() {
return handler;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
public abstract void handle();
}
再把具体的处理者实现出来
public class ConcreteHandler extends Handler{
public ConcreteHandler(String name) {
super(name);
}
@Override
public void handle() {
System.out.println("当前处理:"+getName());
if(getHandler()!=null){
getHandler().handle();
}
}
}
在该具体方法的 handle 里面,处理自个当前需要做的事件,然后寻找后续处理者,把到最后完成。
看下客户端如何处理
public class Client {
public static void main(String[] args) {
Handler h1=new ConcreteHandler("handler1");
Handler h2=new ConcreteHandler("handler2");
h1.setHandler(h2);
h1.handle();
}
}
在责任链模式当中,对处理者而言,一旦一个请求只有一个处理者处理了,称之为纯的责任链模式,然并卵,现实没有这么纯的责任链;那么不纯的就是一个请求被0个或多个处理者处理了,这个情况很常见。责任链使得客户端请求与接收端处理减低耦合度,使得多个处理者都可以处理这个请求。这个链可以是一棵树,也可以是链表,也可以是个环。但是每个处理者只可以传递任务给下一个处理者,或者自己处理掉,不可能同时传递多个。