设计模式之职责链模式

职责链模式

职责链( Chain of Responsibility )模式也被叫做责任链模式,在《设计模式》属于行为型模式,是一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止。责任链模式将请求和处理分离开来,进行解耦。

责任链模式涉及角色

1、抽象处理者( Handler )角色:定义一个处理请求的抽象类。如果需要,可以定义一个方法以设定和返回对下家的引用。

2、具体处理者( ConcreteHandler ) 角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

应用场景

很常见的一个场景:请假。假定请假3天以内,由项目经理直接审批;3-5天,由部门经理审批通过;大于5天,则由总经理通过。

如果把上面的场景应用到责任链模式中去,项目经理、部门经理、总经理就是一个个具体的责任人,他们可以对请求做出处理,但是他们也只能在自己的权限范围内处理该请求。

抽象处理者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 抽象处理者
*/
public static abstract class Handler {
private Handler nextHandler;
// 当前领导能审批通过的最多天数
public int maxDay;
protected Handler(int maxDay) {
this.maxDay = maxDay;
}
//设置责任链中下一个处理请求的对象
public void setNextHandler(Handler handler) {
nextHandler = handler;
}
protected void handleRequest(int day) {
if (day <= maxDay) {
reply(day);
} else {
if (nextHandler != null) {
//审批权限不够,继续上报
nextHandler.handleRequest(day);
} else {
LogUtil.d("没有更高的领导审批了");
}
}
}
protected abstract void reply(int day);
}

具体处理者

项目经理

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 项目经理
*/
class ProjectManager extends Handler {
public ProjectManager(int day) {
super(day);
}
@Override
protected void reply(int day) {
LogUtil.d(day + "天请假,项目经理直接审批通过");
}
}

部门经理

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 部门经理
*/
class DepartmentManager extends Handler {
public DepartmentManager(int day) {
super(day);
}
@Override
protected void reply(int day) {
LogUtil.d(day + "天请假,部门经理审批通过");
}
}

总经理

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 总经理
*/
class GeneralManager extends Handler {
public GeneralManager(int day) {
super(day);
}
@Override
protected void reply(int day) {
LogUtil.d(day + "天请假,总经理审批通过");
}
}

代码调用

1
2
3
4
5
6
7
8
Handler projectManager = new ProjectManager(3);
Handler departmentManager = new DepartmentManager(5);
Handler generalManager = new GeneralManager(15);
//创建职责链
projectManager.setNextHandler(departmentManager);
departmentManager.setNextHandler(generalManager);
//发起一次请求
projectManager.handleRequest(10);

打印

1
04-18 15:18:08.726 19678-19678/com.wuxiaolong.androidsamples D/wxl: 10天请假,总经理审批通过

Android 应用

1、Ordered Broadcast (有序广播)
Ordered Broadcast 的接收者将按预先声明的优先级依次接收 Broadcast 。如:A 的级别高于 B , B 的级别高于 C 。那么,Broadcast 先传给 A ,再传给 B ,最后传给 C 。优先级声明在 元素的 Android:priority 属性中,数越大优先级别越高,取值范围为 -1000~1000 。

2、ViewGroup 事件传递
事件传递也类似于一条责任链,分别有 dispatchTouchEvent (分发)、 onInterceptTouchEvent (拦截)、 onTouchEvent (处理),寻找责任者,一旦责任者消费掉该次事件,就并不再传递,体现在 View 的 onTouchEvent 方法中返回值。

参考

《JAVA与模式》之责任链模式

Android设计模式源码解析之责任链模式

JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】



联系作者

我的微信公众号:吴小龙同学,欢迎关注交流,公号回复关键字「1024」有惊喜哦。