処理のステータスをObserverパターンで画面に通知する

画面から何らかの時間がかかる業務処理を実行して、その状況を画面に表示したいケースがある。画面クラスにビジネスロジックを書いて、その状況を表示するのが単純であるが、画面クラスが肥大化してしまうし、保守性が悪くなる。画面から非同期で業務処理を実行し、そのオブジェクトに対して一定間隔でポーリングして状況を問い合わせる手もあるが、画面側にタイマーをセットして実装する必要があり、これまた保守性が悪い。またCPUに負荷がかかってしまう。スマート方法の一つに、業務処理中に状況が変わった時点で、その情報を画面側に通知してもらう方法がある。下記のサンプルはObserverパターンを使って、処理状況を画面に通知するサンプル(ObserverByPull.ZIP)である。ダウンロードはページはこちら


From1はStartボタンを押すと、ビジネスロジックHogeServiceに処理を依頼し、その処理ステータスを画面に通知してもらう単純なものである。ObserverパターンはObserver(観察者)をSubject(観察対象)にあらかじめ登録しておき、Subjectに状況の変化があった場合に、Observerに通知するメカニズムである。From1はObserverインターフェイスを実現した観察者であり、HogeServiceはSubjectインターフェイスを実現した観察対象である。Form1はボタンをクリックした際に、自分自身をSubject(観察対象)に登録(Register)する。そして、Subject側の処理で何らかの変化があった場合に、「変更があったよ」とObserverに通知(Notify)する。Form1では通知を受け取ると現在の状況をHogeServiceに問い合わせる。例では、通知を受け取るとサービス側に現在のステータス(Level)を問い合わせている。ObserverはSubjectに問い合わせて情報を取得するので、これはPull型のObserverパターンである。

VB.NET

C#

一方、Push型のObserverパターンでは、HogeServiceから画面に通知(Notify)するときに、変更情報を一緒に通知する方法である。Pull型と異なる点は、NotifyメソッドとUpdateXXXメソッドに引数があるところだけである。下記の例では、画面側は通知を受け取ると、引数の情報でプログレスバーを更新している。(C#のサンプルはCsObserverByPush.ZIP,VBのサンプルVbObserverByPush.ZIP)


VB.NET

C#

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/318

関連情報

Copyright(C) 2007 アーキテクト360 Allrights reserved.