--[[
職責鏈模式:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
應用:
1、有多個對象處理請求,到底怎麼處理在運行時確定。
2、希望在不明確指定接收者的情況下,向多個對象中的一個提交請求。
3、可處理一個請求的對象集合應該被動態指定。
]]--
Handler = {}
function Handler:new(o)
o = o or {}
setmetatable(o,self)
self.__index = self
return o;
end
function Handler:SetSuccessor(s)
self.successor = s
end
ConcreteHandler1 = Handler:new()
function ConcreteHandler1:HandleRequest(r)
if r <= 10 then
print("Handler1處理了請求")
elseif self.successor then
self.successor:HandleRequest(r)
end
end
ConcreteHandler2 = Handler:new()
function ConcreteHandler2:HandleRequest(r)
if r > 10 and r <= 20 then
print("Handler2處理了請求")
elseif self.successor then
self.successor:HandleRequest(r)
end
end
ConcreteHandler3 = Handler:new()
function ConcreteHandler3:HandleRequest(r)
if r > 20 then
print("Handler3處理了請求")
elseif self.successor then
self.successor:HandleRequest(r)
end
end
h1 = ConcreteHandler1:new()
h2 = ConcreteHandler2:new()
h3 = ConcreteHandler3:new()
h1:SetSuccessor(h2)
h2:SetSuccessor(h3)
print("*********************實例一***********************")
h1:HandleRequest(25)
h2:HandleRequest(5)
h3:HandleRequest(15)
print("*********************實例二***********************")
h1:HandleRequest(25)
h1:HandleRequest(5)
h1:HandleRequest(15)
--[[
PS:
當時"弄懂"了職責鏈模式後,不禁心裡大罵:尼瑪,這不就是狀態模式嗎?!
後來細心地發現了其中的不同:
狀態模式:後一個狀態的處理對象早已在類的內部設定好了。
職責鏈模式:後一個請求的處理對象由客戶端來設定。
]]--
狀態模式lua實現
輸出結果:
*********************實例一***********************
Handler3處理了請求
*********************實例二***********************
Handler3處理了請求
Handler1處理了請求
Handler2處理了請求