观察者模式(python版)

观察者模式:又叫发布-订阅模式。
    它定义了一种一对多的依赖关系,让多个观察者对象同时鉴定某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。

观察者模式所做的工作实际上就是解耦,根据“依赖倒转原则”,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

实际场景中存在的问题:现实中实际观察者不一定有实现观察者的通知回调方法。

解决之道:
1、为其封装一个观察类出来,实现相应的接口。

2、修改通知类,让具体观察者的Notify函数直接去调用相应的接口。

[python] view plaincopy
  1. #encoding=utf-8  
  2. #  
  3. #by panda  
  4. #观察者模式  
  5.   
  6.   
  7. def printInfo(info):  
  8.     print unicode(info, 'utf-8').encode('gbk')  
  9.       
  10. #抽象的通知者  
  11. class Informer():  
  12.     observers = []  
  13.     action = ''  
  14.       
  15.     def Attach(self, observer):  
  16.         self.observers.append(observer)  
  17.           
  18.     def Notify(self):  
  19.         for o in self.observers:  
  20.             o.Update()  
  21.   
  22. #秘书  
  23. class Secretary(Informer):  
  24.     observers = []  
  25.     action = "老板回来了!!!"  
  26.       
  27.       
  28. #老板  
  29. class Boss(Informer):  
  30.     observers = []  
  31.     update = [] #更新函数接口列表  
  32.     action = "我胡汉三回来了!!!"  
  33.     def AddEventCB(self,eventCB):  
  34.         self.update.append(eventCB)  
  35.   
  36.     def Notify(self):  
  37.         for o in self.update:  
  38.             o()  
  39.       
  40.   
  41. #抽象的观察者  
  42. class Observer():  
  43.     name = ''  
  44.     nformer = None;  
  45.       
  46.     def __init__(self, name, secretary):  
  47.         self.name = name  
  48.         self.secretary = secretary  
  49.           
  50.     def Update(self):  
  51.         pass  
  52.   
  53. #看股票的同事  
  54. class StockObserver(Observer):  
  55.     name = ''  
  56.     secretary = None;  
  57.       
  58.     def __init__(self, name, secretary):  
  59.         Observer.__init__(self, name, secretary)  
  60.           
  61.     def Update(self):  
  62.         printInfo("%s, %s, 不要看股票了,继续工作" % (self.secretary.action,self.name))  
  63.           
  64.     def CloseStock(self):  
  65.         printInfo("%s, %s, 不要看股票了,快点工作" % (self.secretary.action,self.name))  
  66.   
  67. #看NBA的同事  
  68. class NBAObserver(Observer):  
  69.     name = ''  
  70.     secretary = None;  
  71.       
  72.     def __init__(self, name, secretary):  
  73.         Observer.__init__(self, name, secretary)  
  74.           
  75.     def Update(self):  
  76.         printInfo("%s, %s, 不要看NBA了,继续工作" % (self.secretary.action,self.name))  
  77.   
  78. def clientUI():  
  79.     secretary = Secretary()  
  80.     stockObserver1 = StockObserver('张三',secretary)      
  81.     nbaObserver1 = NBAObserver('王五',secretary)  
  82.       
  83.     secretary.Attach(stockObserver1)      
  84.     secretary.Attach(nbaObserver1)  
  85.       
  86.     secretary.Notify()  
  87.       
  88.     huHanShan = Boss()  
  89.     stockObserver2 = StockObserver('李四',huHanShan)  
  90.     huHanShan.AddEventCB(stockObserver2.CloseStock)  
  91.     huHanShan.Notify()  
  92.     return  
  93.   
  94.   
  95. if __name__ == '__main__':  
  96.     clientUI();  



类图

原文地址:https://www.cnblogs.com/lddhbu/p/2906314.html