C 設計模式之職責鏈

2022-03-02 16:25:05 字數 4199 閱讀 4210

iron之職責鏈

需求:"iron"的建造一直沒有停止,現在單個部件是有的,但是在部件從工廠裡出來的時候,在組裝到一起之前,我們還是非常有必要對部件進行質量檢測,或者是其它個方面的檢測,又或者是設定部件標識資訊等等,這些操作可以是有序的(也可以是無序的)。

現在為了實現上面的所講的功能來進行演示,然過程中會發現問題,然後解決問題。這裡不多說了直接進入主題。

問題的發現:

首先我定義了乙個componentmodel類,它是要被檢驗的物件

1

///2

///部件

3///

4public

class

componentmodel57

public

intvalue813

}14 }

這裡先定義了乙個請求處理型別的列舉,下面要用到,這樣比用什麼字串或者是數字來作條件判斷要好很多。

1

///2

///請求的處理型別

3///

4public

enum

requeststate

5

再然後,我們再來定義檢驗componentmodel類的型別:

1

///2

///處理請求類1

3///

4public

class

concretehandlercaseone511

public

void

handlerequest(requeststate reqstate)

1220

break;21

case

requeststate.setdefvalue:

22 _commodel.name = "

預設部件";

23//

執行處理

24break;25

default:26

27break;28

}30}31

}32///33

///處理請求類2

34///

35public

class

concretehandlercasetwo

3642

public

void

handlerequest(requeststate reqstate)

4351

break;52

case

requeststate.setdefvalue:

53 _commodel.name = "

預設部件";

54//

執行處理

55break;56

default:57

58break;59

60}61}

62 }

定義了兩個型別,concretehandlercaseone和concretehandlercasetwo兩個型別,都是用來處理檢測componentmodel型別的,現在這些型別都齊全了我們來檢測一下吧。

1 componentmodel commodel = new

componentmodel();

2 concretehandlercaseone caseone = new

concretehandlercaseon(commodel);

3caseone.handlerequest(requeststate.check);

4 concretehandlercasetwo casetwo = new

concretehandlercasetw(commodel);

5 casetwo.handlerequest(requeststate.check);

對的,就是這樣,一次次的檢測下去,如果要檢測20次,並且都是不同的實現,那將非常可怕,**冗餘,而且請求呼叫方和處理方的耦合度也很大,那要怎麼樣讓**更精簡,並且還能有效的解耦,這裡就要用到職責鏈模式。

為了避免請求的傳送者和接收者之間的耦合關係,使多個接受物件都有機會處理請求。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。

——gof

這裡要強調一下的是本篇的示例中並沒有完全遵從設計模式的定義,還是按照本文開始的功能需求來做的設計,當然了模式的核心不變。

設計模式的思想:

現在先對處理方進行抽象:

1

///2

///抽象處理者

3///

4public

abstract

class

handle511

public

abstract

void

handlerequest(requeststatereqstate,componentmodel commodel);

1213 }

既然有了抽象,那就得有具體的實現:

1

///2

///具體處理者

3///

4public

class

concretehandlera : handle522

}23}24

///25

///具體處理者

26///

27public

class

concretehandlerb : handle

2844

}45 }

這裡的型別應該只定義乙個的是為了讓大家看的更明白。

在這裡看抽象處理者handle型別,它裡面有個protected級別的變數successor,successor呢就代表著鍊錶中每一環的指標,指向誰呢?當然是指向下乙個處理者。

現在來看一下呼叫的**:

1 componentmodel commodel = new

componentmodel();

2 handle handlera = new

concretehandlera();

3 handle handlerb = new

concretehandlerb();

4handlera.setsuccessor(handlerb);

5 handlera.handlerequest(requeststate.check, commodel);

看上去已經不錯了,耦合度還是很大的,對於handlera的呼叫,還是再呼叫方直接呼叫的,這時需要乙個中間層,

看一下中間層的定義:

1

///2

///chainofresponsibility模式幫助類

3///

4public

class

corunit515

public

corunit(handle handle, componentmodel commodel)

1620

public

void

registerhandle(handle handle)

2126

else

2730}31

public

void

handlerequest(requeststate reqstate)

3235 }

通過加了一層,再來看一下呼叫方的**:

1 componentmodel commodel = new

componentmodel();

2 corunit corunit = new

corunit(commodel);

3 corunit.registerhandle(new

concretehandlera());

4 corunit.registerhandle(new

concretehandlerb());

5corunit.handlerequest(requeststate.check);6//

執行處理7//

commodel的一些處理

是不是感覺呼叫方,跟實際的處理方之間的關係變得很弱了,這樣目的也就達到了。

出處:

C 設計模式之職責鏈模式

前言 最近心情很差,因為生活,因為工作 所以想請幾天假去麗江玩玩。就向專案經理提交了休假申請,我的專案經理向專案主管提交了我的休假申請,專案主管向部門經理提交了我的休假申請 最後,部門經理同意了我的休假申請。是的,乙個簡單的休假申請,需要這麼複雜的流程,這也是乙個公司保證它正常執行的必要。如果部門經...

C 設計模式之 職責鏈模式

使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。處理請求 this.gettype name,request else if successor null class concretehandler2 h...

設計模式之職責鏈模式

如果我們現在有乙個需求,乙個人他生了病,這個病要在 醫院才能看,但是這個病人並不清楚,就先去了一級醫院,一級醫院的醫生告訴他你的病要去二級醫院看,二級醫院也告訴他 你的病我這裡看不了,你要去 醫院才能看,最後他去 醫院把病看好了.這個過程直接寫成 class patient this.patient...