定義:責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計(jì)模式屬于行為型模式。在這種模式中,通常每個(gè)接收者都包含對(duì)另一個(gè)接收者的引用。如果一個(gè)對(duì)象不能處理該請(qǐng)求,那么它會(huì)把相同的請(qǐng)求傳給下一個(gè)接收者,依此類推。
特點(diǎn):1、降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦。
2、簡(jiǎn)化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)。
3、增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過(guò)改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,允許動(dòng)態(tài)地新增或者刪除責(zé)任。
4、增加新的請(qǐng)求處理類很方便。
企業(yè)級(jí)開(kāi)發(fā)和常用框架中的應(yīng)用:spring,struts的攔截器,servlet的過(guò)濾器
具體實(shí)例:
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
|
/** *這里以公司請(qǐng)假舉例: *1、某人請(qǐng)假(事件) *2、項(xiàng)目組長(zhǎng)審批:小于三天可以審批,大于三天請(qǐng)示上級(jí) *3、部門主管審批:小于十天可以審批,大于十天請(qǐng)示上級(jí) *4、總經(jīng)理審批 :小于30天可以審批,大于30天不批準(zhǔn) */ 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( "王五" ); //指定責(zé)任鏈模式 a.setNextLeader(b); b.setNextLeader(c); a.handler(event); } } /** * 事件對(duì)象,責(zé)任鏈中的具體處理事件 * 該實(shí)例中即為請(qǐng)假這件事兒 */ 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; } } /** * 抽象責(zé)任鏈對(duì)象,后面的所有實(shí)際責(zé)任鏈對(duì)象繼承自該對(duì)象 */ abstract class Leader{ private String name; protected Leader nextLeader; //責(zé)任鏈中的下一個(gè)責(zé)任對(duì)象,這是讓責(zé)任鏈持續(xù)下去的基礎(chǔ) 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); } /** * 請(qǐng)假流程中的第一個(gè)對(duì)象,組長(zhǎng) */ class GroupLeader extends Leader{ public GroupLeader(String name) { super (name); } protected void handler(Event event) { if (event.getDays() < 3 ){ System.out.println( "--------------------請(qǐng)假條--------------------" ); System.out.print( "| 請(qǐng)假人:" +event.getName()+ " | " ); System.out.println( "請(qǐng)假天數(shù):" +event.getDays()+ "天" + " |" ); System.out.println( "| 請(qǐng)假原因:" +event.getReason() + " |" ); System.out.println( "審批人:" + this .getName()+ "(組長(zhǎng)),通過(guò)!" ); System.out.println(); } else { System.out.println( this .getName()+ "(主管),沒(méi)有權(quán)限!" ); this .nextLeader.handler(event); } } } /** * 請(qǐng)假流程中的第二個(gè)對(duì)象,部門主管 */ class Manager extends Leader{ public Manager(String name) { super (name); } protected void handler(Event event) { if (event.getDays() < 10 ){ System.out.println( "--------------------請(qǐng)假條--------------------" ); System.out.print( "| 請(qǐng)假人:" +event.getName()+ " | " ); System.out.println( "請(qǐng)假天數(shù):" +event.getDays()+ "天" + " |" ); System.out.println( "| 請(qǐng)假原因:" +event.getReason() + " |" ); System.out.println( "審批人:" + this .getName()+ "(主管),請(qǐng)假通過(guò)!" ); System.out.println(); } else { System.out.println( this .getName()+ "(總經(jīng)理),沒(méi)有權(quán)限!" ); this .nextLeader.handler(event); } } } /** * 請(qǐng)假流程中的第三個(gè)對(duì)象,總經(jīng)理 */ class GeneralManager extends Leader{ public GeneralManager(String name) { super (name); } protected void handler(Event event) { if (event.getDays() < 30 ){ System.out.println( "--------------------請(qǐng)假條--------------------" ); System.out.print( "| 請(qǐng)假人:" +event.getName()+ " | " ); System.out.println( "請(qǐng)假天數(shù):" +event.getDays()+ "天" + " |" ); System.out.println( "| 請(qǐng)假原因:" +event.getReason() + " |" ); System.out.println( "審批人:" + this .getName()+ "(總經(jīng)理)" ); System.out.println(); } else { System.out.println( "--------------------請(qǐng)假條--------------------" ); System.out.print( "| 請(qǐng)假人:" +event.getName()+ " | " ); System.out.println( "請(qǐng)假天數(shù):" +event.getDays()+ "天" + " |" ); System.out.println( "| 請(qǐng)假原因:" +event.getReason() + " |" ); System.out.println( "審批人:" + this .getName()+ "(總經(jīng)理),請(qǐng)假人不通過(guò)!" ); System.out.println(); } } } |
責(zé)任鏈模式主要用于流程控制這一類的開(kāi)發(fā),相比較于單純用if-else模式,在代碼修改和整合上有更高的效率,更利于代碼維護(hù)。而且,需要增加責(zé)任鏈中的對(duì)象時(shí),需要在再實(shí)現(xiàn)一個(gè)具體的責(zé)任鏈類,然后創(chuàng)建責(zé)任對(duì)象,并維護(hù)責(zé)任鏈關(guān)系就行,不需要更大的開(kāi)銷,而且在實(shí)際設(shè)計(jì)中,我們很多時(shí)候責(zé)任鏈的維護(hù)都在配置文件中進(jìn)行,這樣我們將節(jié)省更多的開(kāi)發(fā)時(shí)間。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。