观察者模式(python版)

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

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


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

解决之道:
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();



类图


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值