--LUA对于观察者模式的实现
--被观察者表
Subject = {}
--类似父类,具体对于lua面向对象编程思想学习看这里:
--http://www.jb51.net/article/55724.htm
function Subject:new(obj)
obj = obj or {}
setmetatable(obj, self) --实例化对象指向Subject,这样就以Subject为模版了
--将Father的__index字段指向自己,以便新对象在找不到指定的key时可以被重定向,即访问Father拥有的key
self.__index = self
end
CreateSubject = Subject:new()
--注册
function CreateSubject:Add(obs)
if self.observers == nil then
self.observers = {}
end
table.insert(self.observers,obs)
end
--注销
function CreateSubject:Del(obs)
for k, v in pairs(self.observers) do
if v == obs then
table.remove(self.observers,k)
break
end
end
end
function ConcreteSubject:Notify()
for _, v in pairs(self.observers) do
v:Update()
end
end
Observe = {}
function Observer:new(obj)
obj = obj or {}
setmetatable(obj,self)
self.__index = self
return o
end
CreateObserver = Observer:new()
function CreateObserver:new(s,n)
obj = {}
setmetatable(obj,self)
self.__index = self
obj.subject = s
obj.observername = n
return obj
end
function CreateObserver:Update()
print(self.observername.."!!"..self.subject.subjectstate)
end
s = CreateSubject:Update()
xiyangyang = CreateObserve:new(s,"喜羊羊")
meiyangyang = CreateObserve:new(s,"美羊羊")
lanyangyang = CreateObserve:new(s,"懒羊羊")
s:Add(xiyangyang)
s:Add(meiyangyang)
s:Add(lanyangyang)
s.subjectstate = "灰太狼来了快躲起来!"
s.Notify()
s:Del(lanyangyang)
s.subjectstate = "灰太狼走了出来吧!"
s:Notify()
【Lua】观察者模式在Lua中的实现
最新推荐文章于 2024-04-16 13:48:43 发布