责任链模式,大家肯定都有听说过,web应用上的tomcat的filter可以理解为一个责任链模式,责任链模式就相当于一个处理链,一个对象从第一个处理对象开始,处理完之后传到第二个,直到最后一个,而且处理对象的顺序和数量可以任意改动。
责任链模式的定义:
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
使用场景:
- 对个对象可以处理同一个请求,但具体哪个对象处理则在运行时动态决定
- 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
- 需要动态指定一组对象处理请求
UML图:
新建一个工程,目录结构
比如说构造一个抽象的领导者
public
abstract
class
Leader {
//上一级的领导处理者
public
Leader
nextHanlder
;
/**
* 处理请求
* */
public
final
void
handleRequest(
int
money
){
if
(
money
<=limit()){
handle(
money
);
}
else
{
if
(
null
!=
nextHanlder
){
nextHanlder
.handle(
money
);
}
}
}
public
abstract
int
limit();
public
abstract
void
handle(
int
money
);
}
在这个抽象的领导类里面只做了两件事。一是定义了两个抽象接口方法来确定一个领导者应有的行为和属性,二是声明看一个处理请求的方法来确定当前领导是否有能力处理报账请求,如果没有这权限,则将该请求转发给上级领导处理。
然后是领导的实现,这里只贴一个
/**
* 老板
* */
public
class
Leader1
extends
Leader{
@Override
public
int
limit() {
//
TODO
Auto-generated method stub
return
10000;
}
@Override
public
void
handle(
int
money
) {
//
TODO
Auto-generated method stub
System.
out
.println(
"老板批复报销"
+
money
+
"元"
);
}
}
客户端
public
class
client {
public
static
void
main(String[]
args
) {
//构造领导者对象
Leader1
liLeader1
=
new
Leader1();
Leader2
liLeader2
=
new
Leader2();
Leader3
liLeader3
=
new
Leader3();
liLeader2
.
nextHanlder
=
liLeader3
;
liLeader3
.
nextHanlder
=
liLeader1
;
liLeader2
.handleRequest(500);
}
}
运行结果这里就不贴了,这知识一个简单的责任链模式的实现。但是在日常应用里很少有纯的责任链模式,一般都有一些变动,比如像链表一样,从单向条链表--》双向链表-》树-》图类似的发展结构。这个只是一个指导思想而已,在安卓中责任链模式的实现比较典型的就是对触摸事件的分发处理。