概述
责任链模式(Chain of Responsibility),是行为型设计模式之一。在编程中,将每一个节点看做是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径一次传递给每一节点对象,直到有对象处理这个请求为止。
定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
简单实现
假设小明需要找公司领导报销差旅费5W元。小明找到组长,组长发现数额太大他没有审批权,于是组长找到部门主管。部门主管只能审批五千元一下的费用,于是部门主管又跑去找经理,经理一看二话不说就找到了老板办公室,因为他也只能批1W以下的费用。上面的场景实际就是一个责任链的例子。小明的请求经过层层传达直至请求被处理,自始至终小明只与组长产生关联,后面具体由谁处理的票据小明并不关心。责任链模式在这里很好的将请求者与处理者解耦。代码模拟如下:
packagecom.zionstudio.okhttp_1003;
public abstract classLeader {
protectedLeadernextHandler;//下一个处理者
protected finalStringTAG=
getClass().getSimpleName();
public final voidhandleRequest(intmoney)
{
if(money <= limit()) {
handle(money);
}else{
nextHandler.handleRequest(money);
}
}
public abstract intlimit();
public abstract voidhandle(intmoney);
}
首先定义一个抽象的处理者类,然后创建具体的处理者
packagecom.zionstudio.okhttp_1003;
importandroid.util.Log;
public classGroupLeaderextendsLeader
{
@Override
public intlimit() {
return1000;
}
@Override
public voidhandle(intmoney)
{
Log.i(TAG,"组长批复"+
money +"元");
}
}
packagecom.zionstudio.okhttp_1003;
importandroid.util.Log;
public classDirectorextendsLeader
{
@Override
public intlimit() {
return5000;
}
@Override
public voidhandle(intmoney)
{
Log.i(TAG,"主管批复"+
money +"元");
}
}
packagecom.zionstudio.okhttp_1003;
importandroid.util.Log;
public classManagerextendsLeader
{
@Override
public intlimit() {
return10000;
}
@Override
public voidhandle(intmoney)
{
Log.i(TAG,"经理批复"+
money +"元");
}
}
packagecom.zionstudio.okhttp_1003;
importandroid.util.Log;
public classBoss
extends
Leader {
@Override
public intlimit() {
return50000;
}
@Override
public voidhandle(intmoney)
{
Log.i(TAG,"老板批复"+
money +"元");
}
}
然后实例化各个处理者,并将他们连成链
GroupLeader groupLeader =newGroupLeader();
Director director =newDirector();
Manager manager =newManager();
Boss boss =newBoss();
groupLeader.nextHandler=
director;
director.nextHandler=
manager;
manager.nextHandler=
boss;
groupLeader.handleRequest(10000);
注意
对于责任链中的每一个处理者对象,其只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者对象在处理了请求之后又将请求转送给下一个节点。对一条责任链来说,一个请求最终只有两种情况,一是被某个处理对象处理,另一个是所有对象都没有对其处理,对于前一种情况我们称该责任链为纯的责任链,对于后一种情况我们称为不纯的责任链。实际应用中,我们所见到的责任链模式大多为不纯的责任链。