Observerの設計パターン、その目的、および実装方法を完全に理解しています。 「疎結合」という用語の意味も理解しています。
しかし、オブザーバーがデザインをより疎結合にする方法はわかりません。
たとえば、オブジェクトBとCがオブジェクトAからその状態に関する更新を取得するとします。 Observerパターンはそのための優れた方法です。しかし、パターンを使用せずに、これをより総当たり的な方法で実装することもできます。
Observerパターンがどのように疎結合設計を可能にするかを説明してください。完全に理解できるかわかりません。ありがとう
(ここでも、「疎結合」の意味を理解していますが、オブザーバーが設計をより疎結合にすることをどのように可能にするかは正確ではありません)。
オブザーバーパターンを使用すると、AはBまたはCについて知る必要がありません。Aが明示的にBとCを呼び出した場合、BとCについては必ず知っているはずです。
あなたのやり方にもよりますが、BとCはAについてさえ知りません。
その「知識の欠如」がデカップリングコンポーネントの中核です。
オブザーバーパターンを実装する最も簡単な方法は、タイプライブラリでISourceとISinkの2つのインターフェイスを定義することです。
信号を送信できるオブジェクトはISourceを実装し、信号を受信できるオブジェクトはISinkを実装します。これらの実装はタイプライブラリに依存しますが、相互参照を含める必要はありません。
アプリケーションでは、どちらのクラスも他のオブジェクトの実装に関する知識がなくても、オブジェクトのISourceおよびISinkインターフェイスを接続できます。
本 GoF Book を読むと、オブザーバーパターンの適用性セクション(294ページ)に質問への回答があります。
適用性以下のいずれかの状況でオブザーバーパターンを使用します。
- 抽象化に2つの側面があり、一方が他方に依存している場合。これらの側面を個別のオブジェクトにカプセル化すると、それらを個別に変更して再利用できます。
- 1つのオブジェクトへの変更で他のオブジェクトを変更する必要があり、変更する必要があるオブジェクトの数がわからない場合。
- オブジェクトが他のオブジェクトに誰であるかを想定せずに他のオブジェクトに通知できる必要がある場合。言い換えれば、これらのオブジェクトが密に結合されているものではありません。
ここにいくつかのキーワードがあります:「カプセル化」、「変更して個別に再利用」、「1つのオブジェクトの変更が他のオブジェクトに影響を与える」、「オブジェクトについての仮定」。
これは、パターンをよりよく理解するための調査に役立ちます。また、GoFの本のコピーを入手し、それを読んでもらうのも良い考えかもしれません。