オブザーバーパターンは、「ギャングオブフォー」 デザインパターンブック によって「オブジェクト間の1対多の依存関係として定義されているため、1つのオブジェクトの状態が変化すると、すべてのその依存関係は通知され、自動的に更新されます "。
また、オブザーバーパターンは次のような状況で使用する必要があるとも述べています。
抽象化に2つの側面があり、一方が他方に依存している場合。これらのアスペクトを個別のオブジェクトにカプセル化すると、それらを個別に変更して再利用できます。
1つのオブジェクトへの変更で他のオブジェクトを変更する必要があり、変更する必要があるオブジェクトの数がわからない場合。
オブジェクトが他のオブジェクトに誰であるかを想定せずに他のオブジェクトに通知できる必要がある場合。つまり、これらのオブジェクトを密結合する必要はありません。
Adam Stroudについて Androidデータベースのベストプラクティスブック には、 "CursorクラスがObserverパターンをデータのソースに公開するメソッドを提供していることを示しています。メソッドでは、データベースの変更をポーリングするのではなく、オブザーバーパターンを使用してデータの変更に応答することができます。これは非効率的な場合があります。 ":
Cursor.registerContentObserver()
Cursor.unregisterContentObserver()
Cursor.setNotificationUri()
同様に、ContentProviderを使用することにより、ContentResolverクライアントオブジェクトを使用してコンテンツプロバイダーからのデータにアクセスし、オブザーバーが登録されたURIの背後にあるデータの変更をリッスンするContentObserverを登録できます。
したがって、ObserverパターンのSubjectオブジェクトとして、ContentResolverには、私の考えではほぼ同じメソッドがあります。
contentResolverのregisterContentObserver()はサブジェクトのAttach()です
contentResolverのunregisterContentObserver()はサブジェクトからのDettach()です
contentResolverのnotifyChange()はサブジェクトからのNotify()です
それで、私の質問は、ContentProviderの3つのコンポーネント(ContentProvider、ContentResolver、およびContentObserver)がそれ自体でObserverパターンの実装であるかどうかです。
はいといいえ。
はい、オブザーバーで説明されている相互作用のパターンがこれらのクラスに同等の意味形式で存在するためです。
いいえ、それらのクラスではObserver以外にも多くのことが行われているためです。それらの間では、データの永続性、プロセス間の通信、同期更新と非同期更新なども処理します。
オブザーバーパターン、およびGoFによるその他の多くのパターンは、軽量のミックスインタイプの実装による構成とコードの再利用を可能にするために部分的に特定されました。これはC++で行うことができますが、Javaではそれほどではありません。
もちろん、Javaは多くの理由から、1つのことだけを実行することのない、大きくてヘビー級のクラスに向かう傾向があります。 Javaでは、これらのクラスからオブザーバーパターンビットを借用して他の場所で使用することはできませんでした。代わりに、パターンを再実装します。
したがって、これらのクラスはパターンを実装しますが、GoFの元の精神に沿って、必ずしもパターンのモデル実装であるとは限りません。