深入淺出設計模式python版——觀察者模式(observer)
阿新 • • 發佈:2019-01-02
書中第二個設計模式——觀察者模式
首先,祭出類圖
書中舉得例子:
一般方式
使用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