HF デザインパターンの2章をpythonで書いたもの

# coding: utf-8
from deco import print_fn_name

class Subject(object):

    def __init__(self):
        self._observers = []

    def register_observer(self, observer):
        self._observers.append(observer)

    def remove_observer(self, observer):
        if observer in self._observers:
            self._observers.remove(observer)

    def notify_observer(self):
        for obs in self._observers:
            obs.update()


class Observer(object):

    def __init__(self, subject):
        self._subject = subject
        subject.register_observer(self)

    def update(self):
        pass


class DisplayElement(object):

    def display(self):
        pass


class WeatherData(Subject):

    _observers = None # observerクラスのリスト
    _temperature = 0.0
    _humidity = 0.0
    _pressure = 0.0

    def notify_observer(self):
        for obs in self._observers:
            obs.update(
                self._temperature,
                self._humidity,
                self._pressure
            )

    def measurements_changed(self):
        self.notify_observer()

    def set_measurements(self, arg_temp, arg_hmd, arg_psur):
        self._temperature = arg_temp
        self._humidity = arg_hmd
        self._pressure = arg_psur
        self.measurements_changed()


class CurrentConditionDisplay(Observer, DisplayElement):

    _tmperature = 0.0
    _humidity = 0.0
    _pressure = 0.0
    _weather_data = None # subjectクラスが入る

    def update(self, temp, humidity, pressure):
        self._temperature = temp
        self._humidity = humidity
        self._pressure = pressure

    def display(self):
        pnt = u"現在の気象"
        pnt += u"\n温度: " + str(self._temperature)
        pnt += u"\n湿度: " + str(self._humidity)
        pnt += u"\n気圧: " + str(self._pressure)
        print pnt

        
class WeatherStation(object):

    @staticmethod
    def display():
        weather_data = WeatherData()
        current_display = CurrentConditionDisplay(weather_data)

        weather_data.set_measurements(arg_temp=20.2, arg_hmd=52, arg_psur=1050)
        current_display.display()

if __name__ == '__main__':
    WeatherStation.display()