一.例子:击鼓传花、IE浏览器中的事件冒泡、struts2拦截器?
二.涉及角色:
1.抽象处理者(Handler)角色、定义出一个处理请求的接口;如果需要,接口可以定义出一个方法,以返回对下家的引用,下图给出了一个示意性的类图:
package com.se.design.chainofresp;
public abstract class Handler {
protected Handler successor;
//处理方法
public abstract void handlerRequest();
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
2.具体处理者(ConcreteHandler)角色、处理接到请求后,可以选择将请求处理掉,或者将请 求传给下家。下图给出了一个示意性的类图:
package com.se.design.chainofresp;
public class ConcreteHandler extends Handler {
@Override
public void handlerRequest() {
// TODO Auto-generated method stub
if (getSuccessor() != null)
{
System.out.println(getSuccessor());
getSuccessor().handlerRequest();
}
else
System.out.println("end");
}
}
三.使用责任链模式:
1.系统已经有一个由处理者对象组成的链。这个链可能由复合模式给出,
2.当有多于一个的处理者对象会处理一个请求,而且在事先并不知道到底由哪一个处理者对象处理一个请求。这个处理者对象是动态确定的。
3.当系统想发出一个请求给多个处理者对象中的某一个,但是不明显指定是哪一个处理者对象会处理此请求。
4.当处理一个请求的处理者对象集合需要动态地指定时。