責任鏈模式

2021-09-07 02:59:59 字數 3219 閱讀 2595

什麼是職責鏈模式

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

職責鏈模式的重心是在「鏈」上,由一條鏈去處理相似的請求在鏈中決定誰來處理這個請求,並返回對應的結果。

通用類圖

:抽象處理者。一是定義乙個請求的處理方法handlemessage,唯一對外開放的方法。而是定義乙個鏈的編排方法setnext,設定下乙個處理者;三是定義了詳細的請求者必須實現的兩個方法:定義自己可以處理的級別gethandlerlevel和詳細的處理任務。

client

類:對責任模式進行封裝,直接返回鏈中的第乙個處理者。詳細鏈的設定不須要高層次模組關係,這樣降低模組間的耦合,提高系統的靈活性。

通用**

abstract class handler

public abstract void handlerequest(int request);

}class concretehandler1 : handler

處理請求 ",

this.gettype().name, request);

}else if (successor != null)}}

class concretehandler2 : handler

處理請求 ",

this.gettype().name, request);

}else if (successor != null)}}

class concretehandler3 : handler

處理請求 ",

this.gettype().name, request);

}else if (successor != null)}}

牛刀小試在此以機房收費系統學生下機計算消費金額為例,來實現職責鏈模式。

我們知道關於學生下機操作中須要依據學生上機時間來計算金額。時間分為三種準備時間、至少上機時間、超過至少上機時間。

那麼我們就能夠把這三個時間段分為三個職責來進行操作。

**例如以下

public class student

'學生消費時間

private consumetime as single

'學生消費金額

private consumemoney as single

'學生消費時間的屬性

property getconsumetime as single

getreturn consumetime

end get

set(value as single)

consumetime = value

end set

end property

'學生消費金額的屬性

property getconsumemoney as single

getreturn consumemoney

end get

set(value as single)

consumemoney = value

end set

end property

end class

public mustinherit class level

'定義水平變數

protected superior as level

'設定管理上級

public sub setsuperior(superior as level)

me.superior = superior

end sub

'抽象類,用來處理請求

end class

'準備時間職責

public class preparetime

inherits level

if request.getconsumetime < 5 then '當時間小於5分鐘時

request.getconsumemoney = 0 '在這裡就直接處理了

elseif not isnothing(superior) then '假設大於5分鐘的話,我就沒有許可權了,讓上級處理吧

end if

return request.getconsumemoney

end function

end class

'至少上機時間職責

public class atleasttime

inherits level

if request.getconsumetime < 30 then '小於30分鐘的話,我就直接處理了

request.getconsumemoney = 2

elseif not isnothing(superior) then '不行的話,讓上級處理

end if

return request.getconsumemoney

end function

end class

'上機時間職責

public class onlinetime

inherits level

if request.getconsumetime > 30 then '我是最高許可權者,能夠處理一切

request.getconsumemoney = 4 / 60 * request.getconsumetime

end if

return request.getconsumemoney

end function

end class

上述就是通過把三段時間來匹配三種職責的方式,來計算學生金額。從而避免了過多的if……else分支的推斷

小結:

職責鏈模式的長處是將請求和處理分開。請求這不用知道是誰處理的,處理者不用知道請求的全貌,兩者解耦,能夠提高系統的靈活性。

注意事項:鏈中節點數量須要控制,避免出現超長鏈的情況。

責任鏈模式

責任鏈模式 chain of responsibility 的目標是使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。舉個例子。你到銀行去辦理業務,只是簡單的存個錢,也許atm就解決你的問題。如果你是為了交費...

責任鏈模式

有3個request與3個handler,每個request由相應的handler來處理,當乙個handler與request不匹配時則傳遞給下乙個handler來處理 inte ce request class request1 implements request class request2 ...

責任鏈模式

了解了一下責任鏈模式,簡單的說下自己的理解吧 責任鏈就是說待處理的資料在request的時候,先經過filter1的處理,再經過filter2的處理,然後response時,先經過filter2的處理,在經過filter1的處理。實現思路是filterchain包括filter1和filter2,同...