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