オブザーバーパターン(デザインパターン)

デザインパターンのオブザーバーパターンのメモ

  • オブザーバーパターンを使用すると疎結合なアプリケーションを作成可能。
     (GUIのアプリケーションでよく使用されている。)
  • オブザーバーパターンは、「通知者」から「観測者」に状態を通知する。
  • オブザーバーパターンのメリットとしては、観測者は通知を受け取った場合に動作する。
     (ポーリングしなくともよい。)
  • 通知者をSubjectクラス、観測者をObserverクラスとする。
  • Subjectクラスは、Observerクラスを持つ。
  • Subjectクラスは、Observerクラスを複数持ってもよい。この場合、SubjectクラスはすべてのObserverクラスへ通知を行う。

Observerパターンのクラス図

ObserverPattern クラス図

ObserverクラスのPythonソースコード

  • Observerクラスは、Subjectクラスから通知を受け取る。
  • 抽象クラスの為、インスタンスは作成しないこと。
  • Subjectクラスからの通知は、updateメソッドで受け取る。
  • updateメソッドは、継承したクラスでオーバーライドする。
  • ソースコードの詳細はObserver.pyを参照。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Observer(object):
"""
@brief オブザーバークラス.
更新があった場合, Subjectから通知を受け取るクラス.
@note 抽象クラス. インスタンスは作成しないこと.
"""


def update(self, modifier=None):
"""
@brief Subjetから通知を受け取るメソッド.
@param modifier 更新情報.
@note 本メソッドは継承したクラスでオーバーライドすること.
"""

raise NotImplementedError

SubjectクラスのPythonソースコード(一部抜粋)

  • Subjectクラスは、登録されているObserverクラス全てに通知をする。
  • Observerクラスを登録するには、attachメソッドを使用する。
  • Observerクラスに通知するには、notifyメソッドを使用する。
  • ソースコードの詳細はObserver.pyを参照。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Subject(object):
"""
@brief サブジェクトクラス.
更新があった場合, Observerへ通知するクラス.
"""


def __init__(self):
"""
@brief 初期化.
@param メンバー変数 self._observerList 登録されたオブザーバーリスト.
"""

self._observerList = []

def attach(self, observer):
"""
@brief Observerを登録する.
@param observer 登録するオブザーバー.
@return なし.
"""

if not observer in self._observerList:
self._observerList.append(observer)

def notify(self, modifier=None):
"""
@brief Observerへ更新を通知するメソッド.
@param modifier 更新情報.
"""

for observer in self._observerList:
if observer != modifier:
observer.update(self)

参考文献

17.Observer パターン | TECHSCORE(テックスコア)