视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python学习之观察者模式
2020-11-27 14:20:20 责编:小采
文档


本篇文章主要讲述了Python的观察者模式,代码具有一定参考价值,感兴趣的盆友可以了解一下,希望对你能有所帮助。

需求:员工上班在偷偷看股票,拜托前台一旦老板进来,就通知他们,让他们停止看股票。

这里有两类人,一类是观察者,即员工,一类是通知者,即前台,员工在观察前台的状态,前台负责通知员工最新的动态。

#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'

class Receptionist():
 def __init__(self):
 self.observes=[]
 self.status=''
 def attach(self,observe):
 self.observes.append(observe)
 def notify(self):
 for observe in self.observes:
 observe.update()

class StockObserve():
 def __init__(self,name,receptionist):
 self.name=name
 self.receptionist=receptionist
 def update(self):
 print '%s,%s停止看股票'%(self.receptionist.status,self.name)

if __name__=='__main__':
 receptionist=Receptionist()
 observe1=StockObserve('张三',receptionist)
 observe2=StockObserve('李四',receptionist)
 receptionist.attach(observe1)
 receptionist.attach(observe2)

 receptionist.status='老板来了'
 receptionist.notify()

这里的两个类的耦合是非常大的,它们是相互依赖的。一方面是前台类的notify方法会调用股票观察者类的update方法,另一方面,观察者类会访问调用前台类的status属性来获取最新的动态。

当需求变动时,例如现在老板也可以是通知者,员工除了看股票,还会看nba,如果增加一个Boss类和NBAObserver类,这样这四个类的耦合就会非常紧密,后期维护将非常困难,所以当遇到这种紧耦合的情况时,就需要将它们耦合的部分抽象成一个父类,这样后期维护就会轻松很多

#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
from abc import ABCMeta, abstractmethod

class Subject():
 __metaclass__ = ABCMeta
 observers=[]
 status=''
 @abstractmethod
 def attach(self,observer):
 pass
 @abstractmethod
 def detach(self,observer):
 pass
 @abstractmethod
 def notify(self):
 pass

class Observer():
 __metaclass__ = ABCMeta
 def __init__(self,name,sub):
 self.name=name
 self.sub=sub
 @abstractmethod
 def update(self):
 pass

class Boss(Subject):
 def __init__(self):
 pass
 def attach(self,observer):
 self.observers.append(observer)

 def detach(self,observer):
 self.observers.remove(observer)
 def notify(self):
 for observer in self.observers:
 observer.update()

class StockObserver(Observer):
 def update(self):
 print '%s,%s停止看股票'%(self.sub.status,self.name)
class NBAObserver(Observer):
 def update(self):
 print '%s,%s停止看NBA'%(self.sub.status,self.name)

if __name__=='__main__':
 boss=Boss()
 observe1=StockObserver('张三',boss)
 observe2=NBAObserver('李四',boss)
 boss.attach(observe1)
 boss.attach(observe2)
 boss.detach(observe2)
 boss.status='我是老板,我来了'
 boss.notify()

相关教程:Python视频教程

下载本文
显示全文
专题