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