病殃殃的还是来记录一下学习笔记,不然的话过几天可能就忘了,白学了。
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 马上就收到了。
我想这就是观察者模式(订阅模式)的一个现实中的例子。
来源:oschina
链接:https://my.oschina.net/u/1043170/blog/138430