责任链模式
# 一、概述
责任链(Chain Of Responsibility)模式允许将请求沿着处理链进行发送,处理链上有多个处理器,收到请求的每个处理器可对请求进行处理,或将请求传递给下个处理器。
# 1.1 解决了什么问题
责任链模式的场景很多,比如小李家里有事准备请 7 天假,但是他部门领导只有 1 天的权限,超过 1 天需要其中心领导审批,但是中心领导只有 3 天的权限,超过 3 天需要大 BOSS 审批。小李是请求的发送者,部门经理、中心领导和大 BOSS 都是这条责任链上的处理器,他们每个人都可以处理并终止这个请求或将其转交给下一个处理器,直到该请求被处理。
# 1.2 解决方案
声明一个处理器接口,该接口有两个方法,一个方法为处理当前请求,另一个方法为设置下一个处理器。每个责任链上的处理器都实现该接口。
# 二、实现方式
# 2.1 角色
- Handler:处理器接口,包含两个方法:处理当前请求和设置下一个处理器。
- Concrete Handler:具体处理器,实现了 Handler 中的接口。
- Client:根据程序逻辑一次性或动态生成责任链。
# 2.2 代码
定义 Handler:
public interface Handler {
void setNextHanlder(Handler hanlder);
boolean handle(int days);
}
1
2
3
4
5
2
3
4
5
定义各个 Concrete Handler:
public class GroupLeader implements Handler {
private Handler nextHandler;
@Override
public void setNextHanlder(Handler hanlder) {
this.nextHandler = hanlder;
}
@Override
public boolean handle(int days) {
if (days == 1){
System.out.println("小组领导可以批");
return true;
} else {
System.out.println("小组领导没权限,往上传递");
return this.nextHandler.handle(days);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class CenterLeader implements Handler {
private Handler nextHandler;
@Override
public void setNextHanlder(Handler hanlder) {
this.nextHandler = hanlder;
}
@Override
public boolean handle(int days) {
if (days <= 3) {
System.out.println("中心领导批了");
return true;
} else {
System.out.println("中心领导没权限,往上传递");
return this.nextHandler.handle(days);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Boss implements Handler {
private Handler nextHandler;
@Override
public void setNextHanlder(Handler hanlder) {
this.nextHandler = hanlder;
}
@Override
public boolean handle(int days) {
if (days <= 7) {
System.out.println("Boss批了");
return true;
} else {
System.out.println("不批,滚");
return false;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
定义责任链:
public class HandlerChain {
private Handler head;
/**
* 设置责任链上的处理器
*
* @return
*/
public void setChain(Handler first, Handler... handlers) {
head = first;
for (Handler nextHandler : handlers) {
first.setNextHanlder(nextHandler);
first = nextHandler;
}
}
public void handle(int days) {
head.handle(days);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
客户端:
public class ResponsibilityTest {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.setChain(new GroupLeader(), new CenterLeader(), new Boss());
chain.handle(1);
System.out.println("-------------");
chain.handle(3);
System.out.println("-------------");
chain.handle(5);
System.out.println("-------------");
chain.handle(10);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
小组领导可以批
-------------
小组领导没权限,往上传递
中心领导批了
-------------
小组领导没权限,往上传递
中心领导没权限,往上传递
Boss批了
-------------
小组领导没权限,往上传递
中心领导没权限,往上传递
不批,滚
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 三、源码中的应用
java.util.logging.Logger#log()
上次更新: 2023/11/01, 03:11:44