• 技术文章 >后端开发 >Python教程

    Python学习之观察者模式

    little bottlelittle bottle2019-04-28 10:41:10转载793
    本篇文章主要讲述了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学习之观察者模式的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    上一篇:Python实训之调用math库进行数学运算 下一篇:Python学习之代理模式
    PHP编程就业班

    相关文章推荐

    • Python程序中的观察者模式结构编写• Python设计模式编程中的访问者与观察者模式示例介绍• php中实现观察者模式的代码• Python实训之调用math库进行数学运算

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网