责任链模式(Chain of Responsibility)
半塘 2024/3/28 Java进阶
让多个不同对象请求,并将这些对象连成一条链(类似链表一样),能处理请求就处理,处理不了就沿这条链传递下去,直到有对象处理为止。
# 1、责任链模式案例
按打电话转播为例,各个地区都有自己的处理转播中心。
public enum AreaEnum {
Guangzhou,Shanghai,Beijin;
}
public abstract class Phone {
protected Phone phone;
private Phone(){}
public Phone(Phone phone) {
// 处理为空,没有找到处理对象就这个处理
if(phone==null){
phone = new Phone() {
@Override
public void callAreaHandle(AreaEnum areaEnum) {
System.out.println(areaEnum+"地区转播无法处理");
}
};
}
this.phone = phone;
}
abstract public void callAreaHandle(AreaEnum areaEnum);
}
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
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
public class GuangzhouArea extends Phone{
public GuangzhouArea(Phone phone) {
super(phone);
}
@Override
public void callAreaHandle(AreaEnum areaEnum) {
if(areaEnum.equals(AreaEnum.Guangzhou)){
System.out.println("这是广州地区,我处理了");
return;
}
if(phone!=null){
phone.callAreaHandle(areaEnum);
}
}
}
public class ShanghaiArea extends Phone{
public ShanghaiArea(Phone phone) {
super(phone);
}
@Override
public void callAreaHandle(AreaEnum areaEnum) {
if(areaEnum.equals(AreaEnum.Shanghai)){
System.out.println("这是上海地区,我处理了");
return;
}
if(phone!=null){
phone.callAreaHandle(areaEnum);
}
}
}
public class BeijinArea extends Phone{
public BeijinArea(Phone phone) {
super(phone);
}
@Override
public void callAreaHandle(AreaEnum areaEnum) {
if(areaEnum.equals(AreaEnum.Beijin)){
System.out.println("这是北京地区,我处理了");
return;
}
if(phone!=null){
phone.callAreaHandle(areaEnum);
}
}
}
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class ClientTest {
public static void main(String[] args) {
Phone phone = new GuangzhouArea(new ShanghaiArea(null));
phone.callAreaHandle(AreaEnum.Shanghai);
phone.callAreaHandle(AreaEnum.Guangzhou);
// 北京没有加入责任链中
phone.callAreaHandle(AreaEnum.Beijin);
}
}
/**
* 输出结果:
* 这是上海地区,我处理了
* 这是广州地区,我处理了
* Beijin地区转播无法处理
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15