《 Head First 》学习笔记:观察者模式 (python实现)

情到浓时终转凉″ 提交于 2020-04-11 21:15:21

病殃殃的还是来记录一下学习笔记,不然的话过几天可能就忘了,白学了。

observer mode 在java 用得很多,咱也试一下用python来实现,由于python没有接口,就只能继承一个类来用用了。

先撸一下代码:

ubuntu@yee:/tmp/observer$ vim subject.py

#!/usr/bin/python 
#-*-  coding:utf8  -*- 

class Subject(object): //主题发布中心
    def registerObserver(self,observer): //注册观察者
        pass

    def removeObserver(self,observer):  //删除观察者
        pass

    def notifyObservers(self): //通知中心
        pass


class Observer(object): //观察者
    def update(self,temp,humidity,pressure):
        pass

class DisplayElement(object): //所有的观察都是继承于它,=。= 
    def display(self):
        pass

ubuntu@yee:/tmp/observer$ vim display.py
//这是布告板

#!/usr/bin/python  
#-*- coding:utf8 -*-

from subject import Observer,DisplayElement
from weather import WeatherData

class CurrentConditionsDisplay(Observer,DisplayElement):
    def __init__(self,weatherData):
        super(CurrentConditionsDisplay,self).__init__()
        self.weatherData = weatherData
        self.weatherData.registerObserver(self) //向发布中心注册自己

    def update(self,temp,humidity,pressure): //得到发布中心传送来的消息之后更新数据 
        self.temp = temp
        self.humidity = humidity
        self.pressure = pressure
        self.display()

    def display(self):
        print("Current conditions:" + str(self.temp) + 'F degrees and ' + str(self.humidity) + "% humidity")


ubuntu@yee:/tmp/observer$ vim weather.py
#!/usr/bin/python 
#-*-  coding:utf8  -*- 

from   subject  import  Subject,Observer,DisplayElement

class WeatherData(Subject):
    observers = list() //存储观察者列表 

    def __init__(self):
        super(WeatherData,self).__init__()
        self.observers = list()

    def registerObserver(self,observer):
        self.observers.append(observer)

    def removeObserver(self,observer):
        if self.observers.index(observer) >=  0:
            self.observers.remove(observer)

    def notifyObservers(self):
        for o in self.observers :
            o.update(self.temp,self.humidity,self.pressure)

    def measurementsChanged(self):
        self.notifyObservers()

    def setMeasurements(self,temp,humidity,pressure):
        self.temp = temp
        self.humidity = humidity
        self.pressure = pressure
        self.measurementsChanged()

ubuntu@yee:/tmp/observer$ vim main.py
#!/usr/bin/python 
#-*-  coding:utf8 -*- 

from subject import Subject ,Observer,DisplayElement
from weather import WeatherData
from display import CurrentConditionsDisplay


if __name__ == '__main__' :
    weather  = WeatherData()

    currentDisplay = CurrentConditionsDisplay(weather)

    weather.setMeasurements(80,65,20)
    weather.setMeasurements(99,88,220)
显示效果 :
ubuntu@yee:/tmp/observer$ python main.py 
Current conditions:80F degrees and 65% humidity
Current conditions:99F degrees and 88% humidity
大致看一下上面的代码,如果看懂了,其实也就理解了,逻辑很简单:

一个中心的消息发布者,允许会员注册,一旦有新消息,发布中心会立即通知所有会员并传送新消息过去。

举个具体的应用例子,用过redis 的人,应该会知道,redis 有个sub/pub 的机制,效果图如下:

左图中先用“subscribe room1 room2 ” 订阅了两个聊天室,右图中 聊天室 room1 发布了一条消息,左图中的room1 马上就收到了。

我想这就是观察者模式(订阅模式)的一个现实中的例子。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!