责任链模式

基本理论

责任链模式允许请求沿着处理链进行传递,链中的每个处理者都要决定是自己处理,还是交给下一环处理

在这里有一个很经典的案例就是请假审批,比如我们有这样一个需求,就是当员工请假时,审批规则如下:

  1. 请假天数少于3天,组长审批
  2. 请假天数在3-5天,主管审批
  3. 请求天数大于5天,经理审批

此时就可以使用责任链模式来编写这个代码,这种设计模式有三个核心角色:

  • 抽象处理者:通常包含一个指向下一个处理者的引用和一个处理方法的声明
  • 具体处理者:指定下一个处理者是谁,并且要实现处理的方法
  • 客户端:创建处理者对象并组成责任链的结构,负责将请求发送给第一个处理者

223fbd43-4b5a-4ff2-bb4c-fc2de1410031 (1)

测试代码如下:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.jzo2o.orders.dispatch.test;

public class ApproveTest {
public static void main(String[] args) {
//定义审批链
Handler handler = new JingLiHandler(new ZhuGuangHandler(new ZuZhangHandler(null)));
handler.approve(3);
handler.approve(5);
handler.approve(7);
}

}

//定义业务处理接口
abstract class Handler {
//定义自己的下一级处理者
Handler next;

public Handler(Handler handler) {
this.next = handler;
}

//定义请假审批方法
public abstract void approve(int days);
}

//组长审批类
class ZuZhangHandler extends Handler {
public ZuZhangHandler(Handler handler) {
super(handler);
}

@Override
public void approve(int days) {
if (days <= 3) {
System.out.println("组长审批,允许请假");
} else {
next.approve(days);
}
}
}

//主管审批类
class ZhuGuangHandler extends Handler {
public ZhuGuangHandler(Handler handler) {
super(handler);
}

@Override
public void approve(int days) {
if (days > 3 && days <= 5) {
System.out.println("主管审批,允许请假");
} else {
next.approve(days);
}
}
}

//经理审批类
class JingLiHandler extends Handler {
public JingLiHandler(Handler handler) {
super(handler);
}

@Override
public void approve(int days) {
if (days > 5) {
System.out.println("经理审批,允许请假");
} else {
next.approve(days);
}
}
}