书中第二个设计模式——观察者模式
首先,祭出类图
书中举得例子:
一般方式
使用java内置模块的方式
python代码:
主题/可观察者:
# -*- coding:utf-8 -*-
#Subject.py
import Observer
class Subject:
def __init__(self):
self.__observers = []
self.__changed = True
def registerObserver(self,observer):
self.__observers.append(observer)
def removeObserver(self, observer):
self.__observers.remove(observer)
def notifyObservers(self):
if self.__changed == True:
for everyObserver in self.__observers:
everyObserver.update(self)
self.changed =False
@property
def changed(self):
return self.__changed
@changed.setter
def changed(self, value):
if isinstance(value, bool):
self.__changed = value
class WeatherData(Subject):
def __init__(self):
Subject.__init__(self)
self.__temperature = 0
self.__humidity = 0
@property
def temperature(self):
return self.__temperature
@property
def humidity(self):
return self.__humidity
@temperature.setter
def temperature(self, value):
if isinstance(value, int):
self.__temperature = value
@humidity.setter
def humidity(self, value):
if isinstance(self, int):
self.__humidity = value
def setMeasurements(self, temperature, humidity):
self.temperature = temperature
self.humidity = humidity
self.changed = True
self.notifyObservers()
def main():
weatherData = WeatherData()
currentDisplay = Observer.CurrentConditionsDisplay(weatherData)
statisticsTempDisplay = Observer.StatisticsTempDisplay(weatherData)
weatherData.setMeasurements(25, 50)
weatherData.setMeasurements(26, 70)
weatherData.setMeasurements(12, 32)
if __name__ == "__main__":
main()
观察者:
# -*- coding:utf-8 -*-
#Observer.py
import Subject
import Display
class Observer:
def __init__(self, observable):
self.__observable = observable
observable.registerObserver(self)
self.__temperature = None
self.__humidity = None
def update(self, subject):
pass
class CurrentConditionsDisplay(Observer, Display.Display):
def __init__(self, observable):
Observer.__init__(self,observable)
def update(self, subject):
self.__humidity = subject.humidity
self.__temperature = subject.temperature
self.display()
def display(self):
print "temperature " + str(self.__temperature),
print "humidity " + str(self.__humidity)
class StatisticsTempDisplay(Observer, Display.Display):
def __init__(self, observable):
Observer.__init__(self,observable)
self.__max = 0
self.__min = 200
self.__num = 0
self.__sum = 0
def update(self, subject):
if self.__max < subject.temperature:
self.__max = subject.temperature
if self.__min > subject.temperature:
self.__min = subject.temperature
self.__num = self.__num + 1
self.__sum = self.__sum + subject.temperature
self.display()
def display(self):
print "max " + str(self.__max),
print "min " + str(self.__min),
print "avg " + str(float(self.__sum)/self.__num)
打印类:
# -*- coding:utf-8 -*-
#Display.py
class Display:
def display(self):
pass