zoukankan      html  css  js  c++  java
  • 观察者模式(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();  



    类图

  • 相关阅读:
    node版本切换工具n的使用介绍
    nrm -- npm镜像源管理
    npm vs npx
    Dnsmasq MacOS使用介绍
    Java动态生成类以及动态添加属性
    mysql表名忽略大小写问题记录
    psotgresql之大小写
    java 按字节读写二进制文件(Base64编码解码)
    java解析复杂json:JSONObject 和 JSONArray的使用
    URL编码:怎样读取特殊字符
  • 原文地址:https://www.cnblogs.com/lddhbu/p/2906314.html
Copyright © 2011-2022 走看看