定義:責任鏈模式(Chain of Responsibility Pattern)為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
特點:1、降低耦合度。它將請求的發送者和接收者解耦。
2、簡化了對象。使得對象不需要知道鏈的結構。
3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。
4、增加新的請求處理類很方便。
企業級開發和常用框架中的應用:spring,struts的攔截器,servlet的過濾器
具體實例:
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模式,在代碼修改和整合上有更高的效率,更利于代碼維護。而且,需要增加責任鏈中的對象時,需要在再實現一個具體的責任鏈類,然后創建責任對象,并維護責任鏈關系就行,不需要更大的開銷,而且在實際設計中,我們很多時候責任鏈的維護都在配置文件中進行,這樣我們將節省更多的開發時間。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。