代碼參考《Head First 設計模式》
import abc
from abc import ABC
class Subject(metaclass=abc.ABCMeta):
@abc.abstractmethod
def registerObserver(self, observer):
raise NotImplementedError
class Observer(metaclass=abc.ABCMeta):
@abc.abstractmethod
def update(self, data):
raise NotImplementedError
class DisplayElement(metaclass=abc.ABCMeta):
@abc.abstractmethod
def display(self):
raise NotImplementedError
###############################################
class WeatherData(Subject):
observers = []
temperture = 0.0
def registerObserver(self, o):
self.observers.append(o)
def removeObserver(self, o):
self.observers.remove(o)
def notifyObservers(self):
for o in self.observers:
o.update(self.temperture)
def measurementsChanged(self):
self.notifyObservers()
def setMeasurements(self, temperture):
self.temperture = temperture
self.measurementsChanged()
class CurrentConditionsDisplay(Observer, DisplayElement, ABC):
temperture = 0.0
weatherData = ""
def __init__(self, weatherData):
self.weatherData = weatherData
weatherData.registerObserver(self)
def update(self, temperture):
self.temperture = temperture
self.display()
def display(self):
print("Current conditions:", self.temperture)
class WeatherStation():
weatherData = WeatherData()
currentConditionsDisplay = CurrentConditionsDisplay(weatherData)
###############################################
if __name__ == '__main__':
weatherStation = WeatherStation()
weatherStation.weatherData.setMeasurements(35)