如何用Python语言实现观察者模式

这篇文章主要介绍“如何用Python语言实现观察者模式”,在日常操作中,相信很多人在如何用Python语言实现观察者模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python语言实现观察者模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,微信小程序开发,十载建站对小搅拌车等多个方面,拥有多年的网站制作经验。

示例代码

首先是定义的观察对象基类Observable基类。这个类简单地实现了观察者登录和取消登录以及通知方法。这些方法会在派生类中使用。

# 观察对象基类class Observable:    def __init__(self):        self.observers= []    def attach(self, observer):        print(type(observer), 'has beenattached!')        self.observers.append(observer)    def detach(self, observer):        print(type(observer), 'has beendetached!')        self.observers.remove(observer)    def notify(self):        for oin self.observers:            o.update()

接下来是具象观察对象类。这个类的职责是在自身状态发生变化时调用基类接口向登录的观察者发出更新通知。

# 观察对象具象类class ConcreteObservable(Observable):    def __init__(self):        Observable.__init__(self)        self.state= None
   def set_state(self, state):        self.state= state        self.notify()
   def get_state(self):        return self.state

实际的观察者类只需要实现观察对象基类在通知时希望的update接口即可,具体如下:

# 观察者具象类class ConcreteObserver(Observer):    def __init__(self,observable):        Observer.__init__(self)        self.observable= observable    def update(self):        print(type(self), self.observable.get_state())

下面的演示代码在分别构建Observable和Observer的具象类对象后,将Observer对象注册到Observable对象上。当改变Observable对象的状态时,可以得到状态变化的输出。观察者被删除之后再次改变Observable的状态,则无法得到状态变化的输出。

# 主程序if __name__ == '__main__':    observable = ConcreteObservable()    # 构建观察者    observer= ConcreteObserver(observable)    # 观察者注册    observable.attach(observer)    # 改变观察对象状态,产生输出    observable.set_state('State Changed1!')    # 观察者删除    observable.detach(observer)    # 再次改变观察对象状态,不产生输出    observable.set_state('State Changed2!')

演示程序的输出如所示:

 has been attached! has been attached! State Changed1! State Changed1! has been detached! State Changed2!

到此,关于“如何用Python语言实现观察者模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


本文标题:如何用Python语言实现观察者模式
链接URL:http://ybzwz.com/article/pjcoog.html