定义:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
特点:1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
企业级开发和常用框架中的应用:spring,struts的拦截器,servlet的过滤器
具体实例:
java" id="highlighter_51199">
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
/** *这里以公司请假举例: *1、某人请假(事件) *2、项目组长审批:小于三天可以审批,大于三天请示上级 *3、部门主管审批:小于十天可以审批,大于十天请示上级 *4、总经理审批 :小于30天可以审批,大于30天不批准 */ public class Demo { public static void main(String[] args) { Event event = new Event( "程序员" , 32 , "回老家探亲" ); Leader a = new GroupLeader( "张三" ); Leader b = new Manager( "李四" ); Leader c = new GeneralManager( "王五" ); //指定责任链模式 a.setNextLeader(b); b.setNextLeader(c); a.handler(event); } } /** * 事件对象,责任链中的具体处理事件 * 该实例中即为请假这件事儿 */ class Event{ private String name; private int days; private String reason; public Event(String name, int days, String reason) { super (); this .name = name; this .days = days; this .reason = reason; } public String getName() { return name; } public void setName(String name) { this .name = name; } public int getDays() { return days; } public void setDays( int days) { this .days = days; } public String getReason() { return reason; } public void setReason(String reason) { this .reason = reason; } } /** * 抽象责任链对象,后面的所有实际责任链对象继承自该对象 */ abstract class Leader{ private String name; protected Leader nextLeader; //责任链中的下一个责任对象,这是让责任链持续下去的基础 public Leader(String name) { super (); this .name = name; } public void setNextLeader(Leader nextLeader) { this .nextLeader = nextLeader; } public String getName() { return name; } public void setName(String name) { this .name = name; } protected abstract void handler(Event event); } /** * 请假流程中的第一个对象,组长 */ class GroupLeader extends Leader{ public GroupLeader(String name) { super (name); } protected void handler(Event event) { if (event.getDays() < 3 ){ System.out.println( "--------------------请假条--------------------" ); System.out.print( "| 请假人:" +event.getName()+ " | " ); System.out.println( "请假天数:" +event.getDays()+ "天" + " |" ); System.out.println( "| 请假原因:" +event.getReason() + " |" ); System.out.println( "审批人:" + this .getName()+ "(组长),通过!" ); System.out.println(); } else { System.out.println( this .getName()+ "(主管),没有权限!" ); this .nextLeader.handler(event); } } } /** * 请假流程中的第二个对象,部门主管 */ class Manager extends Leader{ public Manager(String name) { super (name); } protected void handler(Event event) { if (event.getDays() < 10 ){ System.out.println( "--------------------请假条--------------------" ); System.out.print( "| 请假人:" +event.getName()+ " | " ); System.out.println( "请假天数:" +event.getDays()+ "天" + " |" ); System.out.println( "| 请假原因:" +event.getReason() + " |" ); System.out.println( "审批人:" + this .getName()+ "(主管),请假通过!" ); System.out.println(); } else { System.out.println( this .getName()+ "(总经理),没有权限!" ); this .nextLeader.handler(event); } } } /** * 请假流程中的第三个对象,总经理 */ class GeneralManager extends Leader{ public GeneralManager(String name) { super (name); } protected void handler(Event event) { if (event.getDays() < 30 ){ System.out.println( "--------------------请假条--------------------" ); System.out.print( "| 请假人:" +event.getName()+ " | " ); System.out.println( "请假天数:" +event.getDays()+ "天" + " |" ); System.out.println( "| 请假原因:" +event.getReason() + " |" ); System.out.println( "审批人:" + this .getName()+ "(总经理)" ); System.out.println(); } else { System.out.println( "--------------------请假条--------------------" ); System.out.print( "| 请假人:" +event.getName()+ " | " ); System.out.println( "请假天数:" +event.getDays()+ "天" + " |" ); System.out.println( "| 请假原因:" +event.getReason() + " |" ); System.out.println( "审批人:" + this .getName()+ "(总经理),请假人不通过!" ); System.out.println(); } } } |
责任链模式主要用于流程控制这一类的开发,相比较于单纯用if-else模式,在代码修改和整合上有更高的效率,更利于代码维护。而且,需要增加责任链中的对象时,需要在再实现一个具体的责任链类,然后创建责任对象,并维护责任链关系就行,不需要更大的开销,而且在实际设计中,我们很多时候责任链的维护都在配置文件中进行,这样我们将节省更多的开发时间。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。