デザインパターン・Observer(オブザーバ)パターンの実装

デザインパターン・Observer(オブザーバ)パターンの実装をご紹介します。
Observerパターンを使用することで、非同期処理の応答を取得することができ、また依存関係の低減に貢献できます。


Observerパターンとは

Observer(オブザーバ)パターンとは、システムの状態を監視し通知するデザインパターンです。
英語では観察者の意味になりますが、観察者というより通知人ですね。

用途・どんな時に使えるの?

主に以下の目的で使用します。

  • 非同期要求に対して応答する
  • 下位クラスが上位クラスへ通知する

C++やJavaなどクラス継承の概念を持つ言語でよく使われるデザインパターンです。
これらの概念がないC言語ではコールバック関数を用いてオブザーバのようなことをしています。

クラス図

Observer(オブザーバ)

オブザーバのクラス設計図です。
これはstateクラスの状態が変化した時にcontentsクラスへ通知する例です。

まずcontentsはstate_observerを継承し、stateクラスのattach_observerメソッドを用いてstate_observerを登録します。stateクラスの状態が変化すると、登録されたstate_observerのnotify_stateメソッドをコールします。notify_stateがコールされるとcontentsとstate_observerはA is Bの関係であるためオーバーライドされcontentsへ通知されます。

このようにしてstateクラスの状態をstate_observerクラスを経由してcontentsクラスへ通知することができます。

※ExObserverはただのmain関数であり、使用者です。

実装の解説

C++で実装したサンプルコードを解説します。
このサンプルコードは、mainスレッド上でwhileループ待ちし、stateクラスから通知されるSTATUSの状態見てループから抜け出します。

まずcontentsのコンストラクタでstateクラスへthisポインタを登録します。contentsとstate_observerは継承関係(A is B)ですので、thisポインタはstate_observerと同じです。

デストラクタでは不正アクセスやメモリリークの要因にならないよう登録したthisポインタを解除し、delete処理をします。

contents.hでは通知を受け取るメソッドnotify_stateはprivateで定義します。

■ contents.cpp

■ contents.h

stateクラスでは、オブザーバ登録メソッドattach_observerとオブザーバ解除メソッドdettach_observerを定義します。
attach_observerでは引数のポインタを自身がもっているstate_observerクラスへ設定し、dettach_observerはNULLを設定します。

state.hで継承するstate_observerは、通知用のnotify_stateを純粋仮想関数で定義します。

■ state.cpp

■ state.h

■ ExObserver.cpp

サンプルコード

Visual C++ 2017で作成したサンプルコードをGitHubで公開しています。
GitHub – ExObserver

実行結果は以下の通りです。stateクラスからの通知により、notify_stateでSTATUSが変化していることがわかります。

[ 15] Start.
[ 47] 0
[ 25] wait...
[ 25] wait...
[ 25] wait...
[ 25] wait...
[ 47] 1
[ 25] wait...
[ 25] wait...
[ 25] wait...
[ 47] 2
[ 25] wait...
[ 25] wait...
[ 25] wait...
[ 47] 3
[ 25] wait...
[ 33] Terminate.

参考

以下のサイトを参考にさせていただきました。
TECHSCORE(テックスコア) – 17.Observer パターン


  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*

Translate »