【Lua】观察者模式在Lua中的实现

--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()





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值