欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Python学习之观察者模式

程序员文章站 2022-03-16 09:09:07
...
本篇文章主要讲述了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视频教程

以上就是Python学习之观察者模式的详细内容,更多请关注其它相关文章!