概念:避免请求发送者和请求接收者耦合在一起,让多个对象都有可能接收到请求,
将这些对象形成一个链,请求可以沿着这个链路进行传递,直到有对象处理它为止。
UML图:
Handler(抽象处理者):它定义了一个请求处理接口,由于不同处理者处理请求的方式不同,所以它的处理函数应该定义成为一个抽象函数,让不同的子类实现不同的处理逻辑。因为每个处理者的下家还是一个处理者,所以在抽象处理者中定义了一个抽象处理者对象。
ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,实现了抽象处理方法,处理之前需要先检查是否可以处理这个请求,如果不能,则转发为下一个处理者处理。
**Handler(抽象处理者)**
abstract class Handler {
//维持对下家的引用
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor=successor;
}
public abstract void handleRequest(String request);
}
**ConcreteHandler(具体处理者)**
class ConcreteHandler extends Handler {
public void handleRequest(String request) {
if (请求满足条件) {
//处理请求
}
else {
this.successor.handleRequest(request); //转发请求
}
}
}
主要优点
(1) 责任链模式使一个请求对象无需知道是哪个处理对象处理了请求,接收方和发送方都没有对方明确的信息,由客户端创建责任链,降低了耦合度。
(2) 处理者只需要维持下一个处理对象的引用,不需要维持所有候选者的引用,简化了对象的相互连接。
(3) 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。
主要缺点
(1) 如果一个请求没有明确的处理者,那么可能这个请求一直传递到责任链的尾部都得不到处理。
(2) 对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。
(3) 如果建链不当,可能会造成循环调用,将导致系统陷入死循环。
应用:
Picasso源码
事件分发机制