從文字角度出發,我們可以先將關注點放在「鏈」字上,很容易聯想到鏈式結構,舉個生活中常見的例子,擊鼓傳花遊戲就是乙個很典型的鏈式結構,所有人形成一條鏈,相互傳遞。而從另乙個角度說,職責鏈就是所謂的多級結構,比如去醫院開具病假條,普通醫生只能開一天的證明,如果需要更多時常,則需將開具職責轉交到上級去,上級醫師只能開三天證明,如需更多時常,則需將職責轉交到他的上級,以此類推,這就是乙個職責鏈模式的典型應用。再比如公司請假,根據請假時常的不同,需要遞交到的級別也不同,這種層級遞進的關係就是一種多級結構。
職責鏈模式(chain of responsibility),使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。uml結構圖如下:
其中,handler是抽象處理者,定義了乙個處理請求的介面;concretehandler是具體處理者,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求就處理,否則就將該請求**給它的後繼者。
抽象處理者實現了三個職責:
1這裡我們定義三個具體處理者,以便能組成一條鏈,concretehandlerb及concretehandlerc就不再贅述了。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 }
1level類負責定義請求和處理級別,具體內容需根據業務產生。public
class concretehandlera extends
handler 89
@override
10protected
response echo(request request)
1415 }
1request類負責封裝請求,具體內容需根據業務產生。public
class
level
1response類負責封裝鏈中返回的結果,具體內容需根據業務產生。public
class
request
78 }
1我們在場景類或高層模組中對類進行組裝,並傳遞請求,返回結果。如下對三個具體處理者進行組裝,按照1→2→3的順序,並得出返回結果。public
class
response
1當然這是個未完成的模板,最終結果會因為 request.getrequestlevel() 為空而丟擲異常,具體內容需根據業務邏輯進行編寫。public
class
client
1516 }
我們就以請假/加薪為例,實現乙個較為簡單的職責鏈模式。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 }
1public
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...
設計模式 職責鏈模式
今天跟大家分享下設計模式中的職責鏈模式。不知道大家在學習職責鏈模式的時候是否感覺困難。我剛開始學的時候就被整暈了。呵呵,進入正題。職責鏈模式是物件行為型模式中比較有特點的設計模式了,的確有意思,它可以像資料結構中煉表一樣傳遞。其實生活中好多的行為方式都體現了職責鏈模式,我們初期學習者可以把職責鏈模式...