观察者模式:又叫发布-订阅模式。
它定义了一种一对多的依赖关系,让多个观察者对象同时鉴定某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。
观察者模式所做的工作实际上就是解耦,根据“依赖倒转原则”,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
实际场景中存在的问题:现实中实际观察者不一定有实现观察者的通知回调方法。
解决之道:
1、为其封装一个观察类出来,实现相应的接口。
2、修改通知类,让具体观察者的Notify函数直接去调用相应的接口。
- #encoding=utf-8
- #
- #by panda
- #观察者模式
- def printInfo(info):
- print unicode(info, 'utf-8').encode('gbk')
- #抽象的通知者
- class Informer():
- observers = []
- action = ''
- def Attach(self, observer):
- self.observers.append(observer)
- def Notify(self):
- for o in self.observers:
- o.Update()
- #秘书
- class Secretary(Informer):
- observers = []
- action = "老板回来了!!!"
- #老板
- class Boss(Informer):
- observers = []
- update = [] #更新函数接口列表
- action = "我胡汉三回来了!!!"
- def AddEventCB(self,eventCB):
- self.update.append(eventCB)
- def Notify(self):
- for o in self.update:
- o()
- #抽象的观察者
- class Observer():
- name = ''
- nformer = None;
- def __init__(self, name, secretary):
- self.name = name
- self.secretary = secretary
- def Update(self):
- pass
- #看股票的同事
- class StockObserver(Observer):
- name = ''
- secretary = None;
- def __init__(self, name, secretary):
- Observer.__init__(self, name, secretary)
- def Update(self):
- printInfo("%s, %s, 不要看股票了,继续工作" % (self.secretary.action,self.name))
- def CloseStock(self):
- printInfo("%s, %s, 不要看股票了,快点工作" % (self.secretary.action,self.name))
- #看NBA的同事
- class NBAObserver(Observer):
- name = ''
- secretary = None;
- def __init__(self, name, secretary):
- Observer.__init__(self, name, secretary)
- def Update(self):
- printInfo("%s, %s, 不要看NBA了,继续工作" % (self.secretary.action,self.name))
- def clientUI():
- secretary = Secretary()
- stockObserver1 = StockObserver('张三',secretary)
- nbaObserver1 = NBAObserver('王五',secretary)
- secretary.Attach(stockObserver1)
- secretary.Attach(nbaObserver1)
- secretary.Notify()
- huHanShan = Boss()
- stockObserver2 = StockObserver('李四',huHanShan)
- huHanShan.AddEventCB(stockObserver2.CloseStock)
- huHanShan.Notify()
- return
- if __name__ == '__main__':
- clientUI();
类图: