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