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