行為型模式(一) 責任鏈模式

2021-10-08 20:16:59 字數 3953 閱讀 5347

責任鏈(chain of responsibility)模式:為了避免請求傳送者與多個請求處理者耦合在一起,將所有請求的處理者通過前一物件記住其下乙個物件的引用而連成一條鏈;當有請求發生時,可將請求沿著這條鏈傳遞,直到有物件處理它為止。

注意:責任鏈模式也叫職責鏈模式。

在責任鏈模式中,客戶只需要將請求傳送到責任鏈上即可,無須關心請求的處理細節和請求的傳遞過程,所以責任鏈將請求的傳送者和請求的處理者解耦了。

責任鏈模式是一種物件行為型模式,優點:

1、降低了物件之間的耦合度。

該模式使得乙個物件無須知道到底是哪乙個物件處理其請求以及鏈的結構,傳送者和接收者也無須擁有對方的明確資訊。

2、增強了系統的可擴充套件性。

可以根據需要增加新的請求處理類,滿足開閉原則。

3、增強了給物件指派職責的靈活性。

當工作流程發生變化,可以動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任。

4、責任鏈簡化了物件之間的連線。

每個物件只需保持乙個指向其後繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的 if 或者 if···else 語句。

5、責任分擔。

每個類只需要處理自己該處理的工作,不該處理的傳遞給下乙個物件完成,明確各類的責任範圍,符合類的單一職責原則。

缺點:1、不能保證每個請求一定被處理。

由於乙個請求沒有明確的接收者,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理。

2、對比較長的職責鏈,請求的處理可能涉及多個處理物件,系統效能將受到一定影響。

3、職責鏈建立的合理性要靠客戶端來保證,增加了客戶端的複雜性,可能會由於職責鏈的錯誤設定而導致系統出錯,如可能會造成迴圈呼叫。

通常情況下,可以通過資料鏈表來實現職責鏈模式的資料結構。

職責鏈模式的角色:

1、抽象處理者(handler)角色:定義乙個處理請求的介面,包含抽象處理方法和乙個後繼連線。

2、具體處理者(concrete handler)角色:實現抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉給它的後繼者。

3、客戶類(client)角色:建立處理鏈,並向鏈頭的具體處理者物件提交請求,它不關心處理細節和請求的傳遞過程。

其結構如圖1所示,客戶端可按圖2所示設定責任鏈。

圖1 責任鏈模式的結構圖

圖2 責任鏈

1、有多個物件可以處理乙個請求,哪個物件處理該請求由執行時刻自動確定。

2、可動態指定一組物件處理請求,或新增新的處理者。

3、在不明確指定請求處理者的情況下,向多個處理者中的乙個提交請求。

職責鏈模式存在以下兩種情況:

1、純的職責鏈模式:乙個請求必須被某乙個處理者物件所接收,且乙個具體處理者對某個請求的處理只能採用以下兩種行為之一:自己處理(承擔責任);把責任推給下家處理。

2、不純的職責鏈模式:允許出現某乙個具體處理者物件在承擔了請求的一部分責任後又將剩餘的責任傳給下家的情況,且乙個請求可以最終不被任何接收端物件所接收。

圖3 示例**結構

抽象處理者角色:

package

com.example.designpattern.chain

;/**

* @author administrator

* @date 2020/8/4

* 抽象處理者角色

*/abstract

class

abstracthandler

public

void

setnexthandler

(abstracthandler nexthandler)

/** * @param user 經費申請人

* @param fee 申請的經費數額

*/public

abstract

void

handlerequest

(string user,

double fee)

;}

具體處理者角色1:

package

com.example.designpattern.chain

;/**

* @author administrator

* @date 2020/8/4

* 具體處理者角色

* * 專案經理,能處理500元以內的申請

*/class

projectmanager

extends

abstracthandler

else

//超過審批許可權,交給下一處理者

}else

else}}

}

具體處理者角色2:

package

com.example.designpattern.chain

;/**

* @author administrator

* @date 2020/8/4

* 具體處理者角色

* * 部門經理,能處理1000元以內的申請

*/class

deptmanager

extends

abstracthandler

else

//超過審批許可權,交給下一處理者

}else

else}}

}

具體處理者角色3:

package

com.example.designpattern.chain

;/**

* @author administrator

* @date 2020/8/4

* 具體處理者角色

* * 總經理,能處理5000元以內的申請

*/class

generalmanager

extends

abstracthandler

else

//超過審批許可權,交給下一處理者

}else

else}}

}

呼叫:

package

com.example.designpattern.chain

;/**

* @author administrator

* @date 2020/8/4

*/class

client

}

測試結果:

圖4 測試結果

行為型模式之責任鏈模式

目錄應用場景 擴充套件 純 不純的職責鏈模式 在現實生活中,常常會出現這樣的事例 乙個請求有多個物件可以處理,但每個物件的處理條件或許可權不同,如找領導出差報銷等。在計算機軟硬體中也有相關例子,如匯流排網中資料報傳送 異常處理。所有這些,如果用責任鏈模式都能很好解決。責任鏈 chain of res...

設計模式 行為型模式 責任鏈模式

設計模式 行為型模式 責任鏈模式 將請求沿著鏈傳遞,然後直到物件處理即可。邏輯如上,只處理1,2,3情況,其餘的情況都不處理。物件 public class level public boolean above level level 將物件進行封裝 public class request pub...

行為型模型 責任鏈模式

處理類的抽象父類。concretehandler 具體的處理類。責任鏈優缺點 優點 1。責任的分擔。每個類只需要處理自己該處理的工作 不該處理的傳遞給下乙個物件完成 明確各類的責任範圍,符合類的最小封裝原則。2。可以根據需要自由組合工作流程。如工作流程發生變化,可以通過重新分配物件鏈便可適應新的工作...