オブザーバーデザインパターンはポッドキャストのようなものです

ポッドキャストを聴く場合、すでにオブザーバーパターンに精通しています。実際、あなたは「観察者」です。

オブザーバーパターンの定義は次のとおりです。

オブザーバーパターンは、オブジェクト間の1対多の依存関係を定義するため、1つのオブジェクトの状態が変化すると、その依存関係すべてが自動的に通知および更新されます。

ポッドキャストに関連する定義を見てみましょう。

開発者茶という名前の興味深いポッドキャストを見つけました。

SUBSCRIBEボタンをクリックすると、購読者リストに登録されました。

開発者茶が新しいエピソードをリリースすると、アプリは私と他の購読者に通知します。新しいエピソードがダウンロードされます。

それがまさにオブザーバーパターンの定義です!

オブザーバーパターンは、オブジェクト間の1対多の依存関係を定義するため、1つのオブジェクトの状態が変化すると、その依存関係すべてが自動的に通知および更新されます。

開発者の茶ポッドキャストと購読者の間には1対多の関係があります。

新しいエピソードのリリースなど、デベロッパーティーの状態が変化すると、デベロッパーティーのすべてのサブスクライバーに通知され、更新されます。

Rubyで実装しましょう。

シンプルなバージョンから始めます。

Podcastクラスはエピソードのリストを保持し、リストにadd_episodeするメソッドを持っています。

次に、developer_teaポッドキャストを作成し、エピソード#1を次のように追加します。

新しいエピソードがリリースされるたびに通知を受け取りたいです。

リストに新しいエピソードを追加した後、更新できます。

そして、developer_teaからアップデートを入手するたびに、最新のエピソードをダウンロードできます。

私はdeveloper_teaを聴くのが大好きなので、友人のAmberにお勧めします。今、アンバーもそれに加入したいと考えています。

新しいエピソードがリリースされるたびにAmberも通知を受け取るようにする必要があります。

うーん、このコードは私たちが望むことをします。

しかし問題がある。

サブスクライバーを追加するたびに、クラスを再定義する必要があります。

クラスを再定義することなく、サブスクライバーリストを更新する方法はありますか?

subscriber購読者リストを保持できます!

新しいPodcastクラスは、2つの新しいメソッドを使用してサブスクライバーリストを保持します。1つはサブスクライバーの追加用、もう1つはサブスクライバーの削除用です。エピソードがリリースされると、各サブスクライバーが更新されます。

残念ながら、アンバーは私ほどポッドキャストを楽しんでいないので、退会することにしました。 remove_subscriberメソッドを使用して、サブスクライバーリストから彼女を削除します。

うん!オブザーバーパターンを学習しました!

Observerパターンの背後にある設計原則。

Observerパターンは、Loose Coupling設計原則を利用します。

相互作用するオブジェクト間の疎結合設計を目指します。

Podcastクラスは、サブスクライバーについてあまり知りません。各サブスクライバーが更新メソッドを持っていることのみを知っています。

この疎結合により、Podcastとそのサブスクライバー間の依存関係が最小限に抑えられます。また、柔軟性を最大化します。更新メソッドがある限り、サブスクライバーは何でもかまいません:人間、人々のグループ、動物、さらには車です。

テイクアウト:

  1. オブザーバーパターンは、オブジェクト間の1対多の依存関係を定義するため、1つのオブジェクトの状態が変化すると、その依存関係すべてが自動的に通知および更新されます。
  2. 疎結合設計の原則:相互作用するオブジェクト間の疎結合設計に努めます。

読んでくれてありがとう。他に考えられるObserverパターンの実例はありますか?

毎週sihui.ioに公開しています。

定期購読して、シリーズの次の記事を見逃さないようにしてください。

次回は…