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

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

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 马上就收到了。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值