一、概述
责任链模式属于行为型模式的一种,从字面上可理解为由多个节点对象所形成的一条链,每个节点对象拥有相同的结构,并拥有指向下一个处理事件的节点对象的引用,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,这些处理请求的对象按一定的顺序形成一条链,并沿着这条链处理请求,直到该事件被消费了为止。
二、应用场景
当一个请求发生时,有多个对象可以接收并处理该请求,当无非消费该请求时,则传递给下一处理请求的对象,在android中的点击事件分发机制也是属于责任链模式,viewgroup接收到点击事件后分发给子view,下一级的子view如果没有消费该事件即onTouchEvent中返回了false,则继续把事件传递给下一级的子view,直到有子view消费了该事件为止。现实生活中也有同样的例子,有时你需要查看一些公司的文档,但是权限不够,你就去找你的直系领导,你的直系领导权限不够就再继续向上一级发出查看该文档的请求,直到有足够权限的领导批准并把文档给了你则该请求处理完毕,你也可以不用一层层的往上传递该请求,可以越级直接把该请求发送给足够权限的领导处理。
三、简单示例
/*
* 抽象处理者
*/
public abstract class Handler {
//下一处理者节点
protected Handler nextHandler;
public abstract void handleRequest(int request);
public abstract int getLevel();
}
/*
* 具体的请求处理者1
*/
public class ConcreteHandler1 extends Handler{
@Override
public void handleRequest(int request) {
// TODO Auto-generated method stub
if (request == getLevel()) {
System.out.println("have handled");
} else {
nextHandler.handleRequest(request);
}
}
@Override
public int getLevel() {
// TODO Auto-generated method stub
return 1;
}
}
/*
* 具体的请求处理者2
*/
public class ConcreteHandler2 extends Handler{
@Override
public void handleRequest(int request) {
// TODO Auto-generated method stub
if (request == getLevel()) {
System.out.println("have handled");
} else {
nextHandler.handleRequest(request);
}
}
@Override
public int getLevel() {
// TODO Auto-generated method stub
return 2;
}
}
public class RequestClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteHandler1 handler1 = new ConcreteHandler1();
ConcreteHandler2 handler2 = new ConcreteHandler2();
handler1.nextHandler = handler2;
handler2.nextHandler = handler1;
handler1.handleRequest(1);
}
}