今天我們來講一下職責鏈模式。首先我們來模擬一下下面這個場景。
一、案例
在公司,我們需要向領導請假,向領導申**薪,不同級別的領導會做出相應的批示。下面我們用簡單的控制台應用程式來模擬一下這個案例。
1///2
///申請類
3///
4class
request514
15set
1619}20
//申請內容
21private
string
requestcontent;
22public
string
requestcontent
2328
29set
3033}34
//數量
35private
intnumber;
36public
intnumber
3742
43set
4447}48
}4950///
51///
管理者類
52///
53class
manager
5461
//得到結果
62public
void getresult(string
managerlevel, request request)
63: 數量 被批准");
70}71else
72: 數量 我無權處理");
74}75}
76else
if (managerlevel == "總監"
)77: 數量 被批准");
81}82else
83: 數量 我無權處理");
85}86}
87else
if (managerlevel=="
總經理")88
: 數量 被批准");
92}93else
if (request.requesttype=="
加薪"&&request.number<=500)94
: 數量 被批准");
96}97else
if (request.requesttype == "
加薪" && request.number > 500)98
: 數量 再說吧");
100}
101}
102}
103 }
客戶端呼叫:
1public
static
void
main()
2
好,下面我們來分析一下上述**,看看有什麼問題和缺陷。
①:getresult這個方法太長,分支太多,讓人感覺很不舒服,**壞了味道。違背了單一職責的原則
②:如果還有其他的管理級別的管理者,那麼,就需要修改manager類,違背了開放-封閉原則。
我們如何才能不僅實現功能,而且還能解決上述的問題呢?下面就是我們要講的職責鏈模式了。
什麼是職責鏈模式呢?職責鏈模式:使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。
我們來看一下它的**結構
1//定義乙個處理請示的介面
2abstract
class
handler310
//處理請求的抽象方法
11public
abstract
void handlerequest(int
request);12}
1314
//具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理請求就處理它,
15//
否則,將該請求**給它的後繼者。
16class
concretehandler1 : handler17"
);23}24
else
if (successor != null)25
29}30}
31class
concretehandler2 : handler32"
);38}39
else
if (successor != null)40
44}45 }
客戶端
1public
static
void
main()2;
8foreach (int request in
requests)912
console.readkey();
13 }
這當中,最關鍵的是當客戶提交乙個請求時,請求是沿著鏈傳遞直至有乙個concretehandler物件負責處理它。接收者和傳送者都沒有對方的明確訊息,且鏈中的物件自己也並不知道鏈的結構。結果是職責鏈可簡化物件的相互連線,他們僅需保持乙個指向其後繼者的引用,而不需要保持它所有的候選接受著的引用。
下面,我們用職責鏈模式將我們案例重構一下。
1///2
///申請類
3///
4class
request514
15set
1619}20
//申請內容
21private
string
requestcontent;
22public
string
requestcontent
2328
29set
3033}34
//數量
35private
intnumber;
36public
intnumber
3742
43set
4447}48
}
49//
管理者50
abstract
class
manager
5160
//設定管理者的上級
61public
void
setsuperior(manager superior)
6265
66abstract
public
void67}
68//
經理69
class
commonmanager:manager
7074
75public
override
void76"
);80}81
else
8288}89
}90}91
//總監
92class
majordomo : manager
9397
98public
override
void99"
);103
}104
else
105111
}112
}113
}114
//總經理
115class
generalmanager : manager
116120
121public
override
void
122"
);126
}127
else
if (request.requesttype=="
加薪"&&request.number<=500
)128
131else
132135
}136 }
客戶端:
1public
static
void
main()
2
職責鏈模式(23)
今天我們來講一下職責鏈模式。首先我們來模擬一下下面這個場景。一 案例 在公司,我們需要向領導請假,向領導申 薪,不同級別的領導會做出相應的批示。下面我們用簡單的控制台應用程式來模擬一下這個案例。1 2 申請類 3 4class request514 15set 1619 20 申請內容 21priv...
職責鏈模式(23)
今天我們來講一下職責鏈模式。首先我們來模擬一下下面這個場景。一 案例 在公司,我們需要向領導請假,向領導申 薪,不同級別的領導會做出相應的批示。下面我們用簡單的控制台應用程式來模擬一下這個案例。1 2 申請類 3 4class request514 15set 1619 20 申請內容 21priv...
職責鏈模式
1.職責鏈 namespace dutychainpattern 用來處理請求 public abstract void transmitrequest int request 班主任 職責鏈上的乙個節點,在裡面進行判斷,看能否處理請求,不能則將請求轉移 public class classadvi...