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

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

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

ファイル一覧

  • observer_py.py

実装

  1. from abc import ABCMeta, abstractmethod
  2.  
  3. # このへんインターフェイス定義
  4. class Observer(metaclass=ABCMeta):
  5. @abstractmethod
  6. def update(temp, humidity, pressure):
  7. pass
  8.  
  9. class DisplayElement(metaclass=ABCMeta):
  10. @abstractmethod
  11. def display():
  12. pass
  13.  
  14. class Subject(metaclass=ABCMeta):
  15. @classmethod
  16. @abstractmethod
  17. def registerObserver(self, observer):
  18. pass
  19.  
  20. @abstractmethod
  21. def removeObserver(self, observer):
  22. pass
  23.  
  24. @abstractmethod
  25. def notifyObservers(self):
  26. pass
  27. # end class Subject
  28.  
  29. class WeatherData(Subject):
  30.  
  31. __temparature = 0
  32. __humidity = 0
  33. __pressure = 0
  34. observers = []
  35.  
  36. def __init__(self):
  37. pass
  38.  
  39. def registerObserver(self, observer):
  40. self.observers.append(observer)
  41.  
  42. def removeObserver(self, observer):
  43. self.observers.remove(observer)
  44.  
  45. def notifyObservers(self):
  46. for o in self.observers:
  47. o.update(self.__temparature, self.__humidity, self.__pressure)
  48.  
  49. def measurementsChanged(self):
  50. self.notifyObservers()
  51.  
  52. def setMeasurements(self, temparature, humidity, pressure):
  53. self.__temparature = temparature
  54. self.__humidity = humidity
  55. self.__pressure = pressure
  56.  
  57. self.measurementsChanged()
  58. # end class WeathreData
  59.  
  60. class CurrentConditionsDisplay(Observer, DisplayElement):
  61. __temparature = 0
  62. __humidity = 0
  63. __weatherData = Subject
  64.  
  65. def __init__(self, weatherData):
  66. self.__weatherData = weatherdata
  67. weatherData.registerObserver(self)
  68.  
  69. def update(self, temparature, humidity, pressure):
  70. self.__temparature = temparature
  71. self.__humidity = humidity
  72. self.display()
  73.  
  74. def display(self):
  75. print('CurrentConditionsDisplay : ' + str(self.__temparature) + ', ' + str(self.__humidity))
  76. # end class CurrentConditionsDisplay
  77.  
  78. class Display2(Observer, DisplayElement):
  79. __temp=0
  80. __wd = Subject
  81.  
  82. def __init__(self, weatherData):
  83. self.__wd = weatherData
  84. weatherData.registerObserver(self)
  85.  
  86. def update(self, temparature, humidity, pressure):
  87. self.__temp = temparature
  88. self.display()
  89.  
  90. def display(self):
  91. print('disp2 : ' + str(self.__temp))
  92. #end class Display2
  93.  
  94. if __name__ == "__main__":
  95. weatherdata = WeatherData()
  96. CurrentConditionsDisplay(weatherdata)
  97. Display2(weatherdata)
  98. weatherdata.setMeasurements(30,70,1)
  99. weatherdata.setMeasurements(11,22,33)

所感

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

コメント

このブログの人気の投稿

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

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

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