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