天天看點

設計模式系列之九:職責鍊模式

前言

責任鍊模式屬于行為型設計模式,所謂責任鍊,就是把責任處理對象連成一條鍊,這樣當一個處理對象不能及時處理的時候就會交給下一個處理對象處理,直到被處理為止。就像我們找人簽字蓋章的時候,當一個對象不能處理的時候他會告訴你你應該下一個部門進行蓋章,而如果下一個部門仍然不能處理就會繼續告訴你下一個應該去的部門,直到把章蓋好。這個例子不一定恰當,但是反映了責任傳遞這麼一個過程。責任傳遞是責任鍊模式的核心,責任鍊模式使得多個處理對象有機會處理請求,進而避免請求發送者與請求接收者之間的解耦,把這些對象連成一條鍊,并把請求沿着這條鍊進行傳遞,直到完成請求的處理。請求發送者并不需要哪一個對象處理這個請求,因為總有一個請求接收者進行處理。在責任鍊模式中,由于請求的處理對象要形成一條鍊,是以每一個處理對象都要儲存下一個處理對象的引用,這點與資料結構中的連結清單很相似。

問題背景

假設小張需要申請加薪,于是他首先向部門經理申請,部門經理覺得這個他做不了主于是又彙報給總監,總監覺得他也做不了主,于是就彙報給總經理,總經理覺得小張的表現很不錯,遂同意小張的加薪申請。

那麼就根據責任鍊模式進行編碼

測試結果:

設計模式系列之九:職責鍊模式

可以發現,applicant對象僅僅是把加薪申請直接送出給他的直接上級,至于他的直接上級能否處理則不是他需要關心的了,對與申請人來說他隻關心申請處理的結果,處理細節不需要關心。而處理細節是在manager對象中進行定義的,通過設定上下級關系使得申請可以被逐級交給下一個處理對象進行處理,這也是責任鍊模式最吸引人的地方。當然模式總會有不足,比如,如果當申請送出到總經理那裡的時候,總經理沒有進行及時處理就會造成申請人的持續等待,這時我們不希望看到的。最後,我們再對責任鍊模式進行一個簡單的總結:

發送者不需要知道接收者的具體資訊,隻要交給一個接收者就可以了。降低了客戶與系統的耦合程度

對于每一個具體的處理對象來講,它隻需要儲存其下一個處理對象的引用就可以了,這樣就使得處理對象之間的耦合度降低

責任鍊的結構是在用戶端定義的,這就使得可以随時增加或者修改責任鍊的結構,增強了指派責任的靈活性

如果請求到達責任鍊的末端仍然沒有處理就會造成用戶端的等待

繼續閱讀