責任鏈模式是一種物件的行為模式。在責任鏈模式裡,很多物件由每乙個物件對其下家的引用而連線起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某乙個物件決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪乙個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
讓我們去試著理解這一段話,責任鏈模式,會將一組物件組合成乙個鏈式結構,乙個請求,會在這個物件鏈上被傳遞和處理,而客戶端卻不需要知道請求是如何被處理、被哪個物件處理的。
處理請求的這個動作,對於客戶端來說是封裝起來的,所以這部分邏輯的修改是不會影響到客戶端的。而鏈式結構,相對來說比較靈活,便於修改結構。
接下來我們來看乙個實際生活中的例子:
假如你們公司的架構是:開發、組長、總監、經理。現在讓你去設計乙個請假功能,規定3天以內,組長審批,超過3天,不足5天,總監審批。超過5天,經理審批。
經過需求分析,你很容易就設計出了這樣的**:
/*** 申請.
* *
@author
jialin.li
* @date 2019-12-23 17:34 */
public
class
request
public
integer getdays()
public
return}}
/*** 管理者.
* *
@author
jialin.li
* @date 2019-12-23 17:36 */
public
class
manager
public
boolean
handler(request request)
else
case "總監":
if (days < 5)
else
case "經理":
system.out.println("經理已審批");
return
true
;
default
:
return
true
; }}}
/*** 測試.
* *
@author
jialin.li
* @date 2019-12-23 17:47 */
public
class
main
private
static
void
handler(request request, manager teamleader, manager director, manager manager)
if (!isok) }}
小張首先這種**非常的僵硬,如果組織架構調整,那麼我們既要修改客戶端**也要修改服務端**。其次這種**不符合單一職責原則,乙個manager類,承擔了組長、總監、經理三個物件的三個處理邏輯,可讀性很差。然後是他也不依賴倒置原則,客戶端直接和服務端**耦合在了一起。最後是每次修改組織架構,都要去修改已經寫好的**邏輯,不符合開閉原則。組長已審批
小李組長無權審批
組長無權審批
經理已審批
這就要用到我們今天學習的責任鏈模式了,其實大多數的設計模式,都是為了讓**符合設計原則,而設計原則,又是對物件導向的封裝、繼承、多型的合理運用。
我們來看一下責任鏈模式的結構圖:
handler(抽象處理者):它定義了乙個處理請求的介面,一般設計為抽象類,由於不同的具體處理者處理請求的方式不同,因此在其中定義了抽象請求處理方法。因為每乙個處理者的下家還是乙個處理者,因此在抽象處理者中定義了乙個抽象處理者型別的物件,作為其對下家的引用。通過該引用,處理者可以連成一條鏈。
concretehandler(具體處理者):它是抽象處理者的子類,可以處理使用者請求,在具體處理者類中實現了抽象處理者中定義的抽象請求處理方法,在處理請求之前需要進行判斷,看是否有相應的處理許可權,如果可以處理請求就處理它,否則將請求**給後繼者;在具體處理者中可以訪問鏈中下乙個物件,以便請求的**。
學習了責任鏈模式後,我們利用責任鏈模式重構我們的請假**:
/*** 管理者.
* *
@author
jialin.li
* @date 2019-12-23 18:17 */
public
abstract
class
abstractmanager
abstract
void
}
/*** 申請.
* *
@author
jialin.li
* @date 2019-12-23 17:34 */
public
class
request
public
integer getdays()
public
return}}
/*** 組長.
* *
@author
jialin.li
* @date 2019-12-23 18:20 */
public
class teamleader extends
abstractmanager
else}}
/*** 總監.
* *
@author
jialin.li
* @date 2019-12-23 18:23 */
public
class director extends
abstractmanager
else}}
/*** 經理.
* *
@author
jialin.li
* @date 2019-12-23 18:24 */
public
class manager extends
abstractmanager
}
/*** 測試.
* *
@author
jialin.li
* @date 2019-12-23 18:25 */
public
class
main
}
組長已審批可以看出,這樣的設計非常的靈活,如果組織架構需要調整,只需要新建立乙個類,改變責任鏈的結構即可,不用對服務端的**進行修改,只需要擴充套件即可,每個類負責乙個職位,符合單一原則職責,**也較為簡潔。組長無權審批
經理無權審批
經理已審批
tomcat中的過濾器是乙個鏈式結構,不同的過濾器可以組成乙個過濾器鏈。
設計模式 責任鏈模式
定義 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些請求連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。例項 請假加薪審批 using system using system.collections.generic using system.text namespa...
設計模式 責任鏈模式
責任鏈可以使得系統在不影響客戶端的前提下動態的安排責任鏈和分配責任。責任鏈模式中包含的角色有抽象處理者,具體處理者以及請求的傳送者。責任鏈可以是一條直線,乙個環鏈甚至乙個樹結構。它使得每乙個具體的訊息處理者都有可能處理訊息。抽象的請求處理者 author wly public abstract cl...
設計模式 責任鏈模式
責任鏈模式 chain ofresponsibility pattern 基本概念 責任鏈,顧名思義,是指乙個負責相應請求的行為鏈。首先要理解的是乙個鏈,然後通過這個鏈來管理個行為。什麼時候會用到責任鏈 對於乙個請求,沒有特別指明由誰處理或沒有指明如何處理。此時可以使用責任鏈的形式,用過將各種處理行...