責(zé)任鏈模式:多個(gè)對(duì)象由其對(duì)象對(duì)應(yīng)下家的引用連成一條鏈,請(qǐng)求在這個(gè)鏈上傳遞,直到 鏈上的某一個(gè)接收對(duì)象處理此請(qǐng)求。因?yàn)檎?qǐng)求的客戶(hù)端并不知道鏈上最終是誰(shuí)來(lái)處理這個(gè)請(qǐng)求,使得系統(tǒng)可以在不影響客戶(hù)端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任, 從而避免了請(qǐng)求發(fā)送者與請(qǐng)求處理者之間的耦合。
責(zé)任鏈械中涉及到三種角色:
1,抽象處理者角色
2,具體處理者角色
3,請(qǐng)求發(fā)送者
小例子:假設(shè)去買(mǎi)房子,買(mǎi)房子就需要砍價(jià), 賣(mài)房的人職位不同,可以?xún)?yōu)惠的價(jià)格也不同,不同職位就可以形成一個(gè)處理請(qǐng)求的鏈。我們暫定: * 基層銷(xiāo)售員,只能優(yōu)惠3% * 銷(xiāo)售經(jīng)理:可以?xún)?yōu)惠5% * 銷(xiāo)售總監(jiān):可以?xún)?yōu)惠8% * 老板(Boss):優(yōu)惠10%
Java實(shí)例
類(lèi)圖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 抽象責(zé)任 */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this .successor = successor; } public abstract void handleFilter(); public abstract void handleFilter2(); } |
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
|
/** * 具體責(zé)任 */ public class ConcreteFilter extends IFilter { private String name; public ConcreteFilter(String name) { this .name = name; } @Override public void handleFilter() { /* * 自己先處理,如有后繼者,再由它處理一次 */ System.out.println(name + " 處理了請(qǐng)求"); if (getSuccessor() != null) { getSuccessor().handleFilter(); } } @Override public void handleFilter2() { /* * 有后繼者就后繼者處理, 否則自己處理 */ if (getSuccessor() != null ) { getSuccessor().handleFilter2(); } else { System.out.println(name + " 處理了請(qǐng)求" ); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Test { public static void main(String[] args) { IFilter filter1 = new ConcreteFilter( "permission-filter" ); //權(quán)限過(guò)濾 IFilter filter2 = new ConcreteFilter( "suffix-filter" ); //后綴名過(guò)濾 IFilter filter3 = new ConcreteFilter( "style-filter" ); //風(fēng)格過(guò)濾 filter1.setSuccessor(filter2); filter2.setSuccessor(filter3); System.out.println( "------以下是每一個(gè)處理者(包括后繼者)都處理了, 順序也是一級(jí)一級(jí)的傳遞------" ); filter1.handleFilter(); System.out.println( "------以下是交由最后一個(gè)后繼者處理------" ); filter1.handleFilter2(); } } |
打印:
1
2
3
4
5
6
|
------以下是每一個(gè)處理者(包括后繼者)都處理了, 順序也是一級(jí)一級(jí)的傳遞------ permission-filter 處理了請(qǐng)求 suffix-filter 處理了請(qǐng)求 style-filter 處理了請(qǐng)求 ------以下是交由最后一個(gè)后繼者處理------ style-filter 處理了請(qǐng)求 |