什麼是職責鏈模式
使多個物件都有機會處理請求。從而避免請求的傳送者和接受者之前的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。
職責鏈模式的重心是在「鏈」上,由一條鏈去處理相似的請求在鏈中決定誰來處理這個請求,並返回對應的結果。
通用類圖
:抽象處理者。一是定義乙個請求的處理方法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,同...