我们总有请假的时候,每个单位可能制度都不一样,但都对请假时间长短有规定不同流程。例如0.5-1天假向经理报告,2-3天假向hr报告,3以上的假期需总经理或老板签字等等。既然有这种状况,程序也务必会遇到此类情况,要说的就是处理此类问题时可能用到的设计模式——职责链模式。


  • 举例

示例,当前我有个请假的请求发送至上司,≤5天由SimpleRequestHandler处理,反之,SpecialRequestHandler处理。

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
//请求
class Request {
private String name;
private int day;
public Request(String name, int day) {
this.name = name;
this.day = day;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
}
//处理器抽象类
abstract class Handler {
private Handler successor;
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
abstract String handle(Request request);
}
//简易请求处理器
class SimpleRequestHandler extends Handler {
@Override
public String handle(Request request) {
//加强健壮性,防止没有后续处理器而报空指针
if(request.getDay() < 5 && getSuccessor() != null) {
return getSuccessor().handle(request);
}
return request.getName() + "请≤5天假 >>>>> 批准";
}
}
//特殊请求处理器
class SpecialRequestHandler extends Handler {
@Override
public String handle(Request request) {
return request.getName() + "请≥5天假 >>>>> 批准";
}
}
public class ChainOfResponsibility {
public static void main(String[] args) {
//TOM请≤5天假 >>>>> 批准
Request request = new Request("TOM", 1);
//TIM请≥5天假 >>>>> 批准
Request request = new Request("TIM", 11);
Handler handler = new SimpleRequestHandler();
handler.setSuccessor(new SpecialRequestHandler());
System.out.println(handler.handle(request));
}
}

有上面main方法的三句代码可见的,对于每个请求来说,只需要面对一个处理器即可,大大的降低请求与处理的耦合。除此之外,也能让每个处理器有机会处理请求。

1
2
3
Handler handler = new SimpleRequestHandler();
handler.setSuccessor(new SpecialRequestHandler());
handler.handle(new Request("TOM", 1));

  • JDK中的职责链模式

doFilter没能完全看懂,看懂了再来补偿