HeadFirstデザパタ 第2章ObserverパターンをPythonで適当に実装。

HeadFirstデザパタ 第2章ObserverパターンをPythonで適当に実装。

PythonのおさらいとObserverの感触を掴むため、書籍「HeadFirstデザインパターン」の第2章Observerパターンを適当に実装。

ファイル一覧

  • observer_py.py

実装

from abc import ABCMeta, abstractmethod

# このへんインターフェイス定義
class Observer(metaclass=ABCMeta):
    @abstractmethod
    def update(temp, humidity, pressure):
        pass

class DisplayElement(metaclass=ABCMeta):
    @abstractmethod
    def display():
        pass

class Subject(metaclass=ABCMeta):
    @classmethod
    @abstractmethod
    def registerObserver(self, observer):
        pass

    @abstractmethod
    def removeObserver(self, observer):
        pass

    @abstractmethod
    def notifyObservers(self):
        pass
# end class Subject

class WeatherData(Subject):

    __temparature = 0
    __humidity = 0
    __pressure = 0
    observers = []

    def __init__(self):
        pass

    def registerObserver(self, observer):
        self.observers.append(observer)

    def removeObserver(self, observer):
        self.observers.remove(observer)

    def notifyObservers(self):
        for o in self.observers:
            o.update(self.__temparature, self.__humidity, self.__pressure)

    def measurementsChanged(self):
        self.notifyObservers()

    def setMeasurements(self, temparature, humidity, pressure):
        self.__temparature = temparature
        self.__humidity = humidity
        self.__pressure = pressure

        self.measurementsChanged()
# end class WeathreData

class CurrentConditionsDisplay(Observer, DisplayElement):
    __temparature = 0
    __humidity = 0
    __weatherData = Subject

    def __init__(self, weatherData):
        self.__weatherData = weatherdata
        weatherData.registerObserver(self)

    def update(self, temparature, humidity, pressure):
        self.__temparature = temparature
        self.__humidity = humidity
        self.display()

    def display(self):
        print('CurrentConditionsDisplay : ' + str(self.__temparature) + ', ' + str(self.__humidity))
# end class CurrentConditionsDisplay

class Display2(Observer, DisplayElement):
    __temp=0
    __wd = Subject

    def __init__(self, weatherData):
        self.__wd = weatherData
        weatherData.registerObserver(self)

    def update(self, temparature, humidity, pressure):
        self.__temp = temparature
        self.display()

    def display(self):
        print('disp2 : ' + str(self.__temp))
#end class Display2

if __name__ == "__main__":
    weatherdata = WeatherData()
    CurrentConditionsDisplay(weatherdata)
    Display2(weatherdata)
    weatherdata.setMeasurements(30,70,1)
    weatherdata.setMeasurements(11,22,33)

所感

スクリプト言語とデザインパターンの相性の悪さというか、無意味さを感じながらの実装でしたわ。
インターフェイス定義とかあんまり意味ないね。
メソッド強制程度の意味合いしか無い。
ポリモーフィズムとかそういうのは無い。

コメント

このブログの人気の投稿

windows10 で nvidia のグラボのcode43現象を解決した

Java : processbuilder 標準出力 タイムアウト

GTX560Ti がおかしい(code 43が出る)(2018年)→解決しました(2019)