設計模式之責任鏈模式

2021-08-09 07:11:09 字數 2187 閱讀 6675

責任鏈模式(chain of responsibility) 為解除請求的傳送者和接收者之間的耦合,而使多個物件都有機會處理這個請求。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它。

示例需求:模擬公司請假或者加薪的制度,請假天數不大於2天的由經理處理,請假天數大於2天不超過5天的請求由總監處理,請假大於5天或者請求加薪時由總經理處理。

首先定義處理請求行為的父類:

/**

* handler類

*/public abstract class manager

protected manager superior;

public void setsuperior(manager superior)

}

經理:

/**

* 具體處理的類

*/ public class commonmanager extends manager

//最先接受請求的經理物件,由其向後**請求。請假天數不大於2天的由其處理。

@override

if (request.getrequesttype().getvalue().equals(requesttype.dayoff.getvalue()) &&

request.getnumber() <= 2) else if (superior != null)

}}

總監:

public class majordomo extends manager 

//總監物件,處理請假天數不超過5天的請求。

@override

if (request.getrequesttype().getvalue().equals(requesttype.dayoff.getvalue()) &&

request.getnumber() <= 5) else if (superior != null)

}}

總經理:

public class generalmanager extends manager 

//請假大於5天或者請求加薪時由總經理處理

@override

if (request.getrequesttype().getvalue().equals(requesttype.dayoff.getvalue())) else if (request.getrequesttype().getvalue().equals(requesttype.addraise.getvalue()) &&

request.getnumber() <= 500) else if (request.getrequesttype().getvalue().equals(requesttype.addraise.getvalue()) &&

request.getnumber() > 500)

}}

請求物件request:

public class request 

public void setrequesttype(requesttype requesttype)

public int getnumber()

public void setnumber(int number)

public string getrequestcontent()

public void setrequestcontent(string requestcontent)

}

public enum requesttype 

public string getvalue()

}

執行測試:

@test

public void chainofresponsibilitytest()

責任鏈模式的好處:當客戶提交乙個請求時,請求時沿鏈傳遞直接有乙個處理物件負責處理它。

這樣做使得接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己並不知道鏈的結構。結果是職責鏈可簡化物件的相互連線。它們僅需保持乙個指向其後繼者的引用,而不需要保持它所有的候選接受者的引用。

我們需要注意的是:在設計具體的處理物件時,我們要確定請求是由當前處理物件出來或者是傳遞給後繼者。

原始碼位址

設計模式之 責任鏈模式

在一些情況下,對乙個訊息 含事件 的響應和處理需要很多物件來參與,這些物件對訊息的處理有前後順序,形成乙個處理鏈條,但物件是否真正處理訊息有賴於在它之前的物件的處理策略,前乙個物件處理後,後乙個物件則不需參與處理,這就是責任鏈模式。現實中有很多類似的場景,比如上訪,上訪一般是從最基層的信訪部門接受信...

設計模式之(責任鏈模式)

chain of responsibleity 責任鏈模式 在責任鏈模式 中,很多物件由每乙個物件對其下家的引用而接。起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某乙個物件決定處理此請求。客戶並不知道鏈上的哪乙個物件最終處理這個請求,系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者...

設計模式之責任鏈模式

假設現在乙個公司的請假流程如下 一天及以下由小組組長審批,一天以上三天以下由經理審批,三天以上七天以下由老闆審批,七天以上直接勸退。如果每次請假時都很長的if else 來判斷該去找誰請假,很不容易擴充套件,我們使用責任鏈模式來實現。首先,是乙個抽象的父類 public abstract class...