--[[
優點:
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()
輸出結果:來一條清蒸魚
來一個蛋糕