设计模式--观察者模式--python


观察者模式:

对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

主要解决:

当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

例子:
主体:报社,报社的业务就是出版报纸
只要有新的报值更新,就会送给订阅了的读者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次变化

 

posted @ 2019-07-11 16:57  米 立  阅读(154)  评论(0编辑  收藏  举报