--[[ 優點: 1.降低對象之間的耦合度。 2.新的命令可以很容易地加入到系統中。 3.可以比較容易地設計一個組合命令。 4.調用同一方法實現不同的功能。 缺點: 使用命令模式可能會導致某些系統有過多的具體命令類。因為針對每一個命令都需要設計一個具體命令類,因此某些系統可能需要大量具體命令類,這將影響命令模式的使用。 Command類:是一個抽象類,類中對需要執行的命令進行聲明,一般來說要對外公布一個execute方法用來執行命令。 ConcreteCommand類:Command類的實現類,對抽象類中聲明的方法進行實現。 Invoker類:調用者,負責調用命令。 Receiver類:接收者,負責接收命令並且執行命令。 ]]-- Command = {} function Command:new(r,o) o = o or {} setmetatable(o,self) self.__index = self o.receiver = r return o; end ConcreteCommand1 = Command:new() function ConcreteCommand1:Execute() self.receiver:Action1() end ConcreteCommand2 = Command:new() function ConcreteCommand2:Execute() self.receiver:Action2() end Receiver = {} function Receiver:new(o) o = o or {} setmetatable(o,self) self.__index = self return o; end function Receiver:Action1() print("來一條清蒸魚") end function Receiver:Action2() print("來一個蛋糕") end Invoker = {} function Invoker:new(o) o = o or {} setmetatable(o,self) self.__index = self o.allcommand = {} return o; end function Invoker:SetCommand(c) table.insert(self.allcommand,c) end function Invoker:ExecuteCommand() for _,v in pairs(self.allcommand) do v:Execute() end end --廚師 是 Receiver chef = Receiver:new() --下面是兩個菜(命令),執行者是Receiver(chef) fish = ConcreteCommand1:new(chef) cake = ConcreteCommand2:new(chef) --調用者 是服務員 waiter = Invoker:new() --服務員下達了兩個菜(命令),執行者當然是Receiver(chef) waiter:SetCommand(fish) waiter:SetCommand(cake) --看似服務員做了兩個菜,實際是Receiver做,從而做了解耦;客人與廚師不用相互緊耦合 waiter:ExecuteCommand()