簡說設計模式 職責鏈模式

2022-07-04 05:42:10 字數 3804 閱讀 5695

從文字角度出發,我們可以先將關注點放在「鏈」字上,很容易聯想到鏈式結構,舉個生活中常見的例子,擊鼓傳花遊戲就是乙個很典型的鏈式結構,所有人形成一條鏈,相互傳遞。而從另乙個角度說,職責鏈就是所謂的多級結構,比如去醫院開具病假條,普通醫生只能開一天的證明,如果需要更多時常,則需將開具職責轉交到上級去,上級醫師只能開三天證明,如需更多時常,則需將職責轉交到他的上級,以此類推,這就是乙個職責鏈模式的典型應用。再比如公司請假,根據請假時常的不同,需要遞交到的級別也不同,這種層級遞進的關係就是一種多級結構。

職責鏈模式(chain of responsibility),使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。uml結構圖如下:

其中,handler是抽象處理者,定義了乙個處理請求的介面;concretehandler是具體處理者,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求就處理,否則就將該請求**給它的後繼者。

抽象處理者實現了三個職責:

1

public

abstract

class

handler else

else16}

1718

return

response;19}

2021

//設定下乙個處理者

22public

void

setnext(handler handler)

2526

//每個處理者的處理等級

27protected

abstract

level gethandlerlevel();

2829

//每個處理者都必須實現的處理任務

30protected

abstract

response echo(request request);

3132 }

這裡我們定義三個具體處理者,以便能組成一條鏈,concretehandlerb及concretehandlerc就不再贅述了。

1

public

class concretehandlera extends

handler 89

@override

10protected

response echo(request request)

1415 }

level類負責定義請求和處理級別,具體內容需根據業務產生。

1

public

class

level

request類負責封裝請求,具體內容需根據業務產生。

1

public

class

request

78 }

response類負責封裝鏈中返回的結果,具體內容需根據業務產生。

1

public

class

response

我們在場景類或高層模組中對類進行組裝,並傳遞請求,返回結果。如下對三個具體處理者進行組裝,按照1→2→3的順序,並得出返回結果。

1

public

class

client

1516 }

當然這是個未完成的模板,最終結果會因為 request.getrequestlevel() 為空而丟擲異常,具體內容需根據業務邏輯進行編寫。

我們就以請假/加薪為例,實現乙個較為簡單的職責鏈模式。uml圖如下:

通過manager抽象類管理所有管理者,setsuperior()方法用於定義職責鏈的下一級,即定義當前管理者的上級。

1

public

abstract

class

manager 910

//設定管理者的上級

11public

void

setsuperior(manager superior)

1415

//申請請求

16public

abstract

void

handlerrequest(request request);

1718 }

經理類如下,只可批准兩天以內的假期,其餘請求將繼續申請上級。

1

public

class commonmanager extends

manager 67

@override

8public

void

handlerrequest(request request) else 15}

16}1718 }

總監類如下,只可批准五天以內的假期,其餘請求將繼續申請上級。

1

public

class majordomo extends

manager 67

@override

8public

void

handlerrequest(request request) else

15} 16}

1718 }

總經理類,可以批准任意時常的假期,並且可以批准是否加薪。

1

public

class generalmanager extends

manager 67

@override

8public

void

handlerrequest(request request) else

if (request.getrequesttype().equals("加薪") && request.getnumber() <= 500) else

if (request.getrequesttype().equals("加薪") && request.getnumber() > 500) 16}

1718 }

1

public

class

request

1011

public

void

setrequesttype(string requesttype)

1415

public

string getrequestcontent()

1819

public

void

setrequestcontent(string requestcontent)

2223

public

intgetnumber()

2627

public

void setnumber(int

number)

3031 }

下面測試幾組資料。

1

public

class

client

3637 }

執行結果如下:

設計模式 職責鏈模式

2008年08月17日 星期日 下午 04 28 using system using system.collections.generic using system.text public officer officer o public abstract void deal action a c...

設計模式 職責鏈模式

1 request.h ifndef request h define request h include include using namespace std class request 請求類定義 endif request h 2 manager.h ifndef manager h def...

設計模式 職責鏈模式

今天跟大家分享下設計模式中的職責鏈模式。不知道大家在學習職責鏈模式的時候是否感覺困難。我剛開始學的時候就被整暈了。呵呵,進入正題。職責鏈模式是物件行為型模式中比較有特點的設計模式了,的確有意思,它可以像資料結構中煉表一樣傳遞。其實生活中好多的行為方式都體現了職責鏈模式,我們初期學習者可以把職責鏈模式...