Python設計模式——觀察者模式(Observer Pattern)

代碼參考《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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章