--[[ 職責鏈模式:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。 應用: 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處理了請求