設計模式之責任鏈模式

2021-10-09 06:21:56 字數 4082 閱讀 8358

責任鏈模式:使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。

責任鏈模式的使用場景

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

在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求。

可處理乙個請求的物件集合應該被動態指定。

責任鏈模式的結構:

責任鏈模式的角色說明:

這裡以乙個模擬請求中做各種校驗為例項,首先構建乙個請求類,其中是否校驗通過使用boolean型別標識,便於判斷,如下:

class

request

public

boolean

ishasencoded()

public

void

sethasencoded

(boolean hasencoded)

public

boolean

ishastoken()

public

void

sethastoken

(boolean hastoken)

public

boolean

ishaskey()

public

void

sethaskey

(boolean haskey)

}

構建責任鏈中處理器的抽象及兩個實現,用於分別判斷請求是否編碼以及是否包含指定的token,抽象類及兩個實現類如下:

abstract

class

requesthandler

public

abstract

boolean

handlerequest

(request request);}

class

encodedfilter

extends

requesthandler

@override

public

boolean

handlerequest

(request request)

// 校驗不通過

return

false;}

}class

tokenfilter

extends

requesthandler

@override

public

boolean

handlerequest

(request request)

// 校驗不通過

return

false;}

}

客戶端類如下:

class

chainclient

public

void

dorequest

(request request)

else

}}

編寫測試**:

public

static

void

main

(string[

] args)

執行結果:

編碼校驗

token校驗

校驗通過

----

----

----

----

----

-編碼校驗

校驗不通過

優點降低耦合度。它將請求的傳送者和接收者解耦。 請求的傳送者不用關心具體是誰去解決問題。

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

增強給物件指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。

增加新的請求處理類很方便

缺點

不能保證請求一定被接收。

系統效能將受到一定影響,而且在進行**除錯時不太方便,可能會造成迴圈呼叫。

可能不容易觀察執行時的特徵,有礙於除錯。

在web程式設計中,我們總會定義一些請求***,也就是filter,而filter攔截就是使用了責任鏈模式。我們首先來看一下filter的介面宣告,這是與我們的上面結構中handler相對應:

在web程式設計中,我們總會定義一些請求***,也就是filter,而filter攔截就是使用了責任鏈模式。我們首先來看一下filter的介面宣告,這是與我們的上面結構中handler相對應:

public

inte***ce

filter

void

dofilter

(servletrequest var1, servletresponse var2, filterchain var3)

throws ioexception, servletexception;

default

void

destroy()

}

而filter則需要我們自己首先,我們來設計乙個過濾器,判斷請求中是否有token引數並且符合指定的字串,如下:

class

tokenfilter

implements

filter

// 通過驗證,繼續放行

filterchain.

dofilter

(servletrequest, servletresponse);}

}

public

final

class

implements

filterchain

}

public

void

dofilter

(servletrequest request, servletresponse response)

throws ioexception, servletexception })

;}catch

(privilegedactionexception var7)

}else

}

在dofilter方法中主要是呼叫internaldofilter,主要傳遞請求是在該方法中實現的:

private

void

internaldofilter

(servletrequest request, servletresponse response)

throws ioexception, servletexception

; securityutil.

doasprivilege

("dofilter"

, filter,

classtype, args, principal);}

else

}catch

(servletexception

| runtimeexception | ioexception

var15)

catch

(throwable var16)

}else

; securityutil.

doasprivilege

("service"

,this

.servlet,

classtypeusedinservice, args, principal);}

else

}catch

(servletexception

| runtimeexception | ioexception

var17)

finally

}}

設計模式之 責任鏈模式

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

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

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

設計模式之責任鏈模式

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