观察者模式:
对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
主要解决:
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
例子:
主体:报社,报社的业务就是出版报纸
只要有新的报值更新,就会送给订阅了的读者A,读者B等等
观察者:读者,AB订阅了报纸,那么只要有更新,就会送给AB
A取消了订阅,那么即使报纸更新了,也不会送给A,
#主体
class Subject(object):
def __init__(self):
#_observers [元素是观察者observer的对象]
#这里将主体和观察者绑定到一块儿了
self._observers = []
#增加观察/订阅者
def add_observer(self, observer):
if not observer in self._observers:
self._observers.append(observer)
#删除观察/订阅者
def delete_observer(self, observer):
self._observers.remove(observer)
#通知观察/订阅者 更新
def notify_observer(self):
for observer in self._observers:
#调用的观察者的自定义的update方法
observer.update(self)
# 具体的主题(新闻),这里NewsData继承了Sudject
class NewsData(Subject):
def __init__(self, name,data=0):
#等于super(Subject,self).__init__()
#不覆盖subjet父类的init方法
Subject.__init__(self)
self.name = name
self.data=data
def begin_change(self, value):
self.data = value
self.notify_observer()
#具体观察者observer1号
class ObserverA:
#subject变化后,依赖subject的那部分数据也要跟着更新
#此方法早Subject的notify_observers中被调用
def update(self,newsdata):
print('我是订阅者A,正在的新闻名称%s, 第%s次变化' %
(newsdata.name, newsdata.data))
#具体观察者observer2号
class ObserverB:
#subject变化后,依赖subject的那部分数据也要跟着更新
def update(self,newsdata):
print('我是订阅者B,正在的新闻名称%s, 第%s次变化' %
(newsdata.name, newsdata.data))
#主体开始发布新闻
newsdata=NewsData('北京突发新闻')
observera=ObserverA()
observerb=ObserverB()
#添加订阅者
newsdata.add_observer(observera)
newsdata.add_observer(observerb)
#通知订阅着
newsdata.begin_change(4)
#订阅者无序给便任何代码,就可以随着主题更新而更新了
# 我是订阅者A,正在的新闻名称北京突发新闻, 第4次变化
# 我是订阅者B,正在的新闻名称北京突发新闻, 第4次变化