您的位置:首页 > 编程语言 > Python开发

观察者模式 python实现

2009-03-08 22:26 441 查看
观察者模式在对象之间定义一对多的依赖关系,当主题对象发生变化时,依赖他的对象会收到通知并进行自动更新,观察者模式有‘推’、‘拉’两种模式,本人实现的是‘推’的方式,通过实现‘注册——通知——撤销注册’三个过程实现观察者模式。

由于第一次写这么多python代码,出现2个错误,将足迹留下
1.在函数notifyObserver中调用update()和函数时一个参数少些了一个下划线,导致调试不出来错误
由于是练习,update函数内没有容错处理,所以花了半个小时调试,另外这个错误编译器也不给提示,仅仅显示Traceback (most recent call last):
  File "main.py", line 20, in <module>

        2.好几处类内部的成员前面忘记添加self,我想以后会慢慢习惯的。

 

模式的实现共分四个文件来写,由于python代码基本上可以自解释,这里不再多说,以下是程序清单。

接口定义:interface.py

observer实现:observer.py

subject实现:weather_data.py 数据提供

main文件:main.py

 

interface.py文件清单

#-*- coding:utf-8 -*-

#subject interface
class ISubject():
 def registerObserver(self, observer):
  pass
  
 def removeObserver(self, observer):
  pass
  
 def notifyObserver(self):
  pass

#Observer interface
class IObserver():
 def update(self, temp, humidity, pressure):
  pass

#Display interface 
class IDisplayElement():
 def display(self):
  pass
  
if '__main__' == __name__:
 sbjt = ISubject()
 sbjt.registerObserver(1)
 sbjt.removeObserver(1)
 sbjt.notifyObserver()
 
 obsr = IObserver()
 obsr.update(1,2,3)

 

 observer.py文件清单

#-*- coding:utf-8 -*-
from interface import IObserver, IDisplayElement

#inherit from IObserver, IDisplayElement
class CCurrentConditionDisplay(IObserver, IDisplayElement):
 def __init__(self, temp = 0, humidity = 0, pressure = 0):
  self.__temp = temp
  self.__humidity = humidity
  self.__pressure = pressure
 
 def display(self):
  print ('温度', self.__temp)
  print ('湿度', self.__humidity)
  print ('压力', self.__pressure)
  
 def update(self, temp, humidity, pressure):
  print ('update')
  self.__temp = temp
  self.__humidity = humidity
  self.__pressure = pressure
  self.display()
  
class CAddSomethingDisplay(IObserver, IDisplayElement):
 def __init__(self, temp = 0, humidity = 0, pressure = 0):
  self.__temp = temp
  self.__humidity = humidity
  self.__pressure = pressure
 
 def display(self):
    
  print ('温度', self.__temp)
  print ('湿度', self.__humidity)
  print ('压力', self.__pressure)
  
 def update(self, temp, humidity, pressure):
  #这里是这个面板特殊的处理
  #这里只是简单的加减数字模拟
  self.__temp = self.__temp + 1
  self.__humidity = self.__humidity + 4
  self.__pressure = self.__pressure + 7
  self.display() 

if '__main__' == __name__:
 cc = CAddSomethingDisplay()
 cc.update(1,2,3)
 cc.display()

 

weather_data.py文件清单

#-*- coding:utf-8 -*-
from interface import ISubject
from observer import *

#inherit form ISubject
class CWeatherData(ISubject):
 def __init__(self, temp = 0, humidity = 0, pressure = 0):
  self.observer_list = [] #用于记录观察者
  self.__temp = temp #温度 私有
  self.__humidity = humidity #湿度
  self.__pressure = pressure #气压
  
 def registerObserver(self, observer):
  self.observer_list.append(observer)
  
 def removeObserver(self, observer):
  self.observer_list.remove(observer)
  
 def notifyObserver(self):
  for obsvr in self.observer_list:
   obsvr.update(self.__temp, self.__humidity, self.__pressure)
   
 def measurementChanged(self):
  self.notifyObserver()
  
 def setMeasurements(self, temp, humidity, pressure):
  self.__temp = temp
  self.__humidity = humidity
  self.__pressure = pressure
  self.measurementChanged() 

  
if '__main__' == __name__:
 t = Test()
 weather_data = CWeatherData()
 weather_data.registerObserver(t)
 weather_data.setMeasurements(1,5,2)

 

main.py文件清单

#-- coding: utf-8 --
from weather_data import *
from observer import *

#main
if '__main__'  == __name__:
 
 weather_data = CWeatherData()
 
 current = CCurrentConditionDisplay()

 other_obsvr = CAddSomethingDisplay()
 
 #添加对weather_data的观察者
 weather_data.registerObserver(current)
 
 weather_data.registerObserver(other_obsvr)
 
 #模拟天气变化
 weather_data.setMeasurements(4, 1, 5)

 

#观察者模式到此结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息