命令模式lua實現

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章