责任链模式(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
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
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