观察者模式

概念:对象之间存在一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知.

 

很通俗易懂,就是说n个对象观察1个对象,这个对象改变的时候,n个对象都被通知,怎么实现呢?就是在1个对象中记录n个对象或者这些对象的某些方法,因为要有接口才能通知到位.

 

比如:我要实现当aUpData的时候,通知依赖它的观察者们b跟着执行自己的Updata

Python:

#-*- coding:utf-8 -*-
class A():
	def __init__(self):
		self.m_Callback = []
	def AddCallback(self, func):		#添加依赖关系,添加观察者(的执行方法)
		self.m_Callback.append(func)
	def UpData(self):			#a执行更新
		print 'a is DoUpData'
		for func in self.m_Callback:	#通知观察者们,此处执行记录的func方法
			func()
class B():
	def __init__(self, parent, name):
		self.m_Name = name		#记录名字用于区分
		parent.AddCallback(self.Update)	#添加依赖关系
	def Update(self):			#被通知的更新函数
		print self.m_Name, ' is update'
def Do():
	a = A()		#a是被观察者
	b = []		#b 是观察者们
	nameList = ['1号', '2号', '3号']
	for name in nameList:
		obj = B(a, name)
		b.append(obj)
	a.UpData()	#a执行修改,这时请观察被观察者们是否得到通知,此处为执行UpData
Do()


 

输出结果:

a is DoUpData

1号  is update

2号  is update

3号  is update

 

解释:这里只执行了a.UpData,然而在a.UpData方法中执行观察者们各自添加的func方法,即通知观察者们的操作.

 

观察者模式主要是建立一套触发机制,让被观察者能够触发通知观察者操作们,很像模板.

有优点肯定也有缺点:

1:通知一般是遍历所有被记录观察者们或其方法,所以时间花费可想而知.

2:可能会有循环通知,比如a通知b,b通知c,c再通知a,造成死循环,重点注意.

3:引用问题,python中这种设置回调的方式导致b.func在别处被引用,所以导致b无法正常释放,而其他语言中可能造成野指针,b被释放掉了,这是再来执行b.func.

 

实际应用举例:

游戏中角色升级会改变攻击防御等面板信,所以让这些信息的对象与角色等级建立观察关系,这样在角色升级的时候,顺便调用刷新这些面板信息的方法,就可以很方便地处理很多困扰了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值