观察者模式python实现
class Subject(metaclass=abc.ABCMeta):
'''
观察者模式
'''
@abc.abstractmethod
def registerObserver(self, o):
pass
@abc.abstractmethod
def removeObserver(self, o):
pass
@abc.abstractmethod
def notifyObservers(self):
pass
class Observer(metaclass=abc.ABCMeta):
@abc.abstractmethod
def update(self, temp, humidity, pressure):
pass
class WeatherData(Subject):
def __init__(self):
self.observers = []
self.temprature = None
self.humidity = None
self.pressure = None
def registerObserver(self, o):
self.observers.append(o)
def removeObserver(self, o):
i = self.observers.index(o)
if i >= 0:
self.observers.remove(i)
def notifyObservers(self):
for i in range(len(self.observers)):
observer = self.observers[i]
observer.update(self.temprature, self.humidity, self.pressure)
def measurementsChanged(self):
self.notifyObservers()
def serMeasurements(self, temp, humidity, pressure):
self.temprature = temp
self.humidity = humidity
self.pressure = pressure
self.measurementsChanged()
class CurrentConditionsDisplay(Observer):
def __init__(self, weatherData):
self.temperature = None
self.humidity = None
self.weatherData = weatherData
weatherData.registerObserver(self)
def update(self, temp, humidity, pressure):
self.temperature = temp
self.humidity = humidity
self.display()
def display(self):
print(self.temperature, self.humidity)
if __name__ == '__main__':
weather = WeatherData()
cirrentDisplay = CurrentConditionsDisplay(weather)
weather.serMeasurements(80, 65, 30.4)
weather.serMeasurements(20, 85, 30.4)