これは古い投稿ですが、いずれにしても、他の回答ではどちらのパターンを使用した場合にも何が起こっているかを扱っていないので、チャイムを使って説明します。
委任とオブザーバーのしくみ
委任を使用すると、委任者は、潜在的なイベントのソースが作成された瞬間に、特定のイベントに誰が応答するかを正確に選択します。このリスナーは単一のオブザーバーと考えることができます。オブザーバーパターンの場合、オブザーバーは、気になるときはいつでも、誰が監視しているかを選択します。したがって、オブザーバーと委任では依存関係が逆になります。オブザーバーパターンでは、新聞と購読者をオブザーバーとして考えます。オブザーバーは、関係が作成されるタイミングを制御します。代表団と一緒に、従業員と雇用者について考えてください。雇用主は、関係が作成される時期と、特定のイベントの担当者を正確に管理します。従業員は自分が取り組んでいるタスクを選ぶことはできません...一般的に。
委任には1人のオブザーバーがいる可能性があると主張する人もいますが、2人の真の違いは、イベント処理の割り当て方法にあると思います。イベントのデリゲートレジスタは表示されません。イベントが発生し、委任者がイベントに対してパブリックメソッドを呼び出すまで、イベントが処理されることさえわかりません。
委任の利点
このパターンは非常に厳格であり、ほとんどのregidの設計では、より単純で一般的に堅牢です。潜在的なイベントのソースを初期化するときに、イベントハンドラーを事前に宣言する必要があります。誰かが交通を誘導する必要がある場合、あなたは通りを開く前に交通ディレクターを割り当てます。オブザーバーの場合は、交通警官に、トラフィックが気になるときにいつトラフィックを転送するかを選択させます。
委任の短所
この設計の欠点は、柔軟性がないことです。新聞を購読するためのコードを実装している場合、新聞/委任者は、作成された2番目のニュース記事を誰が読むことができるかを正確に特定する必要があります。オブザーバーパターンを使用すると、後でいつでも登録でき、新聞は新しい人物が登録したことを知るだけで済みます。
委任を選択するのはいつですか?
特定のオブザーバーが確実に必要で、誰を監視するかを変更する理由がない場合は、委任パターンの厳密な設計が有益です。
たとえば、特定のエラーのポップアップの作成を処理するクラス/オブジェクトが必要です。実行時に特定のエラーを処理するユーザーを切り替える必要がある理由は多くありません。そのため、「メモリ不足」エラーを単一のエンティティに委任することは理にかなっています。潜在的なハンドラーの配列を作成してから、それらのハンドラーに「メモリ不足」エラーを登録させることは、あまり意味がありません。これは、この状況でオブザーバーパターンを使用する例です。実行時に、呼び出されるメソッドや変数イベントで呼び出される「デリゲート」を変更したい場合がありますが、実行時に特定のイベントのイベントハンドラーをスワップアウトすることは正常ではありません。
オブザーバーパターンで行うのと同じようにデリゲートを交換することは不可能ではなく、複雑です。現実の世界では、新しい警備員がトラフィックを処理するように、交通警官を入れ替えたいと思うでしょう。より良い設計は、元の代理人を警察署ではなく一人の警察官にするであろうと主張することができますが、私は余談です...