定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式属于行为型设计模式之一。
使用场景
(1)多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
(2)在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
(3)需要动态指定一组对象处理请求。
UML类图
简化模式:
通用模式:
关键点
(1)请求的发起可以从责任链的任何一个节点开始。
(2)责任链中的任意一个处理者对象都只有两个行为,一是处理请求,二是将请求转送给下一个节点。
(3)处理者处理请求后不允许转送到其他节点进行处理。
(4)纯的责任链指请求被责任链中某个处理对象处理的责任链,不纯的责任链指所有处理者对象都没处理请求的责任链。
实现方式
简化模式
Handler基类:
public abstract class Handler{
protected Handler successor;
public abstract void handleRequest(string condition);
}
Handler子类1:
public Handler1 extends Handler{
@Override
public void handleRequest(String condition){
if (null != condition && condition.equals("condition1")){
return;
} else {
successor.handleRequest(condition);
}
}
}
Handler子类2:
public Handler2 extends Handler{
@Override
public void handleRequest(String condition){
if (null != condition && condition.equals("condition2")){
return;
}else {
successor.handleRequest(condition);
}
}
}
调用例子
public class Test{
public static void main(string [] args){
Handler1 mHandler1 = new Handler1();
Handler2 mHandler2 = new Handler2();
mHandler1.successor= mHandler2;
mHandler2.successor= mHandler1;
mHandler2.handleRequest("condition2");
}
}
通用模式
在简化模式的基础上:
(1)Handler子类中添加一个获取处理请求类型(通常表现为权限等级)的方法
(2)对请求进行封装,形成抽象类Request以及其对应子类,每个类中含处理体及其getter、setter方法,以及获取请求类型(通常表现为权限等级)的方法
即可构成通用模式的责任链模式模型代码。
责任链模式的优缺点
优点
>请求者和处理者解耦,代码灵活性得到提高
缺点
>请求链中对处理者遍历可能太长,特别是递归调用,会影响性能
Android中的责任链模型举例
ViewTree自上而下分发事件的机制,即View的事件分发模型
——2017.08.14