观察者模式 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)
#观察者模式到此结束
由于第一次写这么多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)
#观察者模式到此结束
相关文章推荐
- [python实现设计模式]-4.观察者模式-吃食啦!
- Head First 设计模式——观察者模式(Observer Pattern)——Python实现(2)
- 【设计模式】观察者模式(observer)c#/python实现
- 观察者模式(Python实现)
- 23种设计模式之python实现--观察者模式
- Head First 设计模式——观察者模式(Observer Pattern)——Python实现(1)
- Head First 设计模式——观察者模式(Observer Pattern)——Python实现(3)
- python设计模式实现 -- 观察者模式
- 《 Head First 》学习笔记:观察者模式 (python实现)
- 设计模式之观察者模式(Python实现)
- 设计模式十八(观察者模式,python语言实现)
- c++实现设计模式中的观察者模式,削除代码的if else switch
- 观察者模式及c++实现
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 观察者模式(Observer) - Java实现
- python实现单例模式
- Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 ),利用RTTI实现Delphi的多播事件代理研究
- 一个python程序员的ruby三日游(四)——观察者模式
- 观察者模式和委托实现 - 老鼠跑,猫叫,人醒
- JTABLE 一个小格子添加2个按钮实现国际化 使用观察者设计模式
- 设计模式之观察者模式的C++实现