常見的設計模式之責任鏈模式

2021-10-07 03:20:28 字數 2367 閱讀 4125

責任鏈模式(chain of responsibility pattern)是將鏈中的每乙個節點看做乙個物件,每個節點處理的請求均不相同,且內部維護下一節點物件。當乙個請求從鏈式的首段發出時,會沿著鏈的路徑依次傳遞給每乙個節點物件,直至有物件處理這個請求為止。這種型別的設計模式屬於行為型模式。

責任鏈模式主要包含兩種角色:

具體處理者(concretehandle):對請求進行處理,如果不感興趣,則進行**。

接下來以登入驗證為例

public

abstract

class

handle

public

abstract

void

dohandle

(member member)

;}

public

class

validatehadle

extends

handle

system.out.

println

("使用者名稱密碼格式校驗完畢");

chain.

dohandle

(member);}

}

public

class

loginhandle

extends

handle

}

public

class

authhandle

extends

handle

}

public

class

chaintest

}

執行結果:

在jdk中,有乙個非常常見的類filter

public

inte***ce

filter

這個filter 介面非常簡單,相當於責任鏈中的handle抽象角色。再來看一下dofilter方法中最後乙個引數filterchain 類

public

inte***ce

filterchain

只定義了乙個dofilter方法,那他們是怎麼串聯成鏈的呢?我們來看spring的實現mockfilterchain類

public

class

mockfilterchain

implements

filterchain

public

mockfilterchain

(servlet servlet)

public

mockfilterchain

(servlet servlet, filter.

.. filters)

private

static list

initfilterlist

(servlet servlet, filter.

.. filters)

public servletrequest getrequest()

public servletresponse getresponse()

@override

public

void

dofilter

(servletrequest request, servletresponse response)

throws ioexception, servletexception if(

this

.iterator.

hasnext()

)this

.request = request;

this

.response = response;

}}

它把鏈條的所有filter放到list中,然後再呼叫dofilter方法是進行迭代list,也就是說list中的filter會順序執行

uml類圖如下:

將請求與處理解耦

簡化了物件。使得物件不需要知道鏈的結構

鏈路結構靈活,可以通過改變鏈路結構次序,動態的新增或刪除責任

易於擴充套件新的請求處理類

責任鏈過長,會導致處理時間過長,從而影響整體效能

如果節點物件存在迴圈引用,會造成死迴圈,導致系統崩潰

設計模式之 責任鏈模式

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

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

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

設計模式之責任鏈模式

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