管理人の技術ブログです。オブザーバーパターンRxRxの根幹となる考え方はオブザーバーパターンです。このオブザーバーパターンについて見て行きます。オブザーバーパターンの概要オブジェクト指向プログラミングにおいては、「あるオブジェクトが変化したとき、その変更に合わせて他のオブジェクトが行動を起こす」というケースが多々あります。ある例としては「データが変更されたときにUIを更新する」などが当てはまります。このようなとき、「データがUIを知っていて、UIの更新メソッドをそのまま呼び出す」というのは極めて汎用性が低い設計です。データはUIに依存するべきではないからです。「オブジェクトがクラスに依存せずに他のオブジェクトに状態変化を通知するにはどうすればよいか」。この問題をスマートに解決するために考えられたデザインパターンがオブザーバーパターンです。「監視対象のオブジェクトを観測者オブジェクトが監視していて、監視対象が変化したのを観測者が確認したら特定のアクションを起こす」の考え方が基本です。身近な例で言えば、「夜空を見ている人が流れ星が通った数を数える」などでしょうか。実際の実装は逆で、「監視対象のオブジェクトに観測者オブジェクトを登録して、監視対象が変化したときに観測者に変更を通知する」となります。知らないようにすることです。この抽象化を実現するために、一般的にはインターフェースが利用されます。4では、監視対象のインターフェースとしてIObservable<T>が、観測者のインターフェースとしてIObserver<T>が導入されました。Frameworkにこのインターフェースが導入されたのか。Framework標準で導入されるであろうことが大きく関係しているのではないかと思います。IObservable<T>IObservable<T>はSubscribeメソッドのみを持ちます。引数として変更の通知先であるIObserver<T>を要求しており、IObservable<T>の具象クラスではその通知先を記憶することが求められます。変更の通知を行う必要がある場合、Subscribeメソッドで登録されたすべてのIObserver<T>に対して特定のメソッドを呼び出します。戻り値はIDisposableであり、そのDisposeメソッドを呼び出すことで通知を止められるようにします。ジェネリック型Tには、変更通知に用いる型を指定します。IObserver<T>IObserver<T>には、IObservable<T>から状態変更を通知してもらうための3つのメソッドがあります。IObservable<T>は自身の状態の変化に応じてこれらを適切に呼び出すことが求められ、IObserver<T>の実装ではそれに適切に応答することが求められます。何らかのエラーが発生したことを通知します簡単な例題で理解する説明が悪いこともあって文章だけではイメージが掴みにくいと思うので、簡単な実装をすることで確認していきます。今回は、とあるオンラインニュース放送局とニュースの受信者がいることを想定します。「放送局にユーザー登録を行い、登録しているユーザーに対してニュース配信を行う」というものです。「ニュース配信の終了」や「ユーザー登録を解除する」という考え方も一緒に学びます。配信するニュースを定義します。ここではフィールドとしてタイトルと内容のみを持つようにします。タイトルを取得します。}}次に受信者を定義します。複数の受信者を区別できるように名前を設定するようにしています。ニュースを受信したときの挙動も記述します。ここでは、コンソール画面にどのメソッドが呼ばれたかを出力するようにしています。受信者としての機能を提供します。受信者名を取得します。プロバイダーがプッシュベースの通知の送信を完了したことをオブザーバーに通知します。プロバイダーでエラー状態が発生したことをオブザーバーに通知します。オブザーバーに新しいデータを提供します。}}さらに、オンラインニュース放送局を定義します。Subscribeメソッドにより登録された受信者を記憶し、受信対象者に対してニュースを配信するようにしています。配信を終了する機能も付いています。Subscribeメソッドの戻り値を用いてユーザー登録解除を行えるようにします。オンラインニュース配信元としての機能を提供します。購読を解除する機能を提供します。オブザーバーのコレクションを保持します。オブザーバーを保持します。使用していたリソースを解放します。オブザーバーのコレクションを保持します。オブザーバーが通知を受け取ることをプロバイダーに通知します。