您的位置:首页 > 编程语言 > Python开发

观察者模式(python版)

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

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

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

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

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

[python] view plaincopy

#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();

类图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: