職責鏈模式(23)

2021-07-27 04:55:16 字數 3981 閱讀 4515

今天我們來講一下職責鏈模式。首先我們來模擬一下下面這個場景。

一、案例

在公司,我們需要向領導請假,向領導申**薪,不同級別的領導會做出相應的批示。下面我們用簡單的控制台應用程式來模擬一下這個案例。

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 }

客戶端呼叫:

1

public

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 }

客戶端

1

public

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 }

客戶端:

1

public

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...