設計模式之責任鏈模式

2021-07-26 21:42:09 字數 2203 閱讀 4639

責任鏈模式是一種行為模式,很多時候我們物件在處理乙個請求的條件是比較靈活的,可能**中存在大量的if-else結構,不同條件的處理邏輯可能比較複雜,可能會使乙個類過分的複雜,或者可能不符合類的單一原則,而且對於處理方式的改變也很可能會涉及到原有**的改變,責任鏈模式就是解決這樣一種應用場景的可能.

責任鏈的uml圖

主要由三個角色組成:

handler : 責任鏈的基礎,維護handler的引用,類似於鍊錶的結構,處理請求部分和傳遞請求部分.

concretehandler : 實現handler,具體的請求可以處理的方式由它來處理.

client : 傳送請求的客戶端.

以下**實現:

abstract

class

handler

// 獲取下乙個鏈

protected handler nexthandler() ;

public

abstract

void dorequest(int request) throws exception;

}class

handlera

extends

handler

@override

public

void dorequest(int request) throws exception else

}}class

handlerb

extends

handler

@override

public

void dorequest(int request) throws exception else }}

客戶呼叫:

int request = 3;

handler handler = new handlera(new handlerb(null));

try catch (exception e)

在客戶端傳送請求後,並不知道到底是哪個物件處理了請求,只知道傳送給了乙個鏈,這樣也解耦了請求的傳送方和處理方.

我們可以模擬乙個實際情況中的乙個例子,例如員工請假,不同的天數由不同的物件批准,作為普通員工只需要提交請假條即可,並不需要關心誰批假:

// 無論是誰批假,都是員工

abstract

class

employee

protected employee nextemployee()

public

abstract

void dorequest(int daysnumber);

}class

manager

extends

employee

@override

public

void dorequest(int daysnumber) else

}}class

departmentmanager

extends

employee

@override

public

void dorequest(int daysnumber) else

}}class

boss

extends

employee

@override

public

void dorequest(int daysnumber)

}

普通員工的遞交請假條:

employee employee = new manager(new departmentmanager(new boss(null)));

employee.dorequest(2);// 2天假期

employee.dorequest(4);

employee.dorequest(10);

經理批准了假期

部門經理批准了假期

老闆批准了假期

責任鏈讓呼叫者和處理解耦,很多框架的請求處理都是沿著某個路徑傳遞了請求,可以通過除錯工具一步步跟蹤,缺點是增加了傳遞過程,增加了類的數量.

設計模式之 責任鏈模式

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

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

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

設計模式之責任鏈模式

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