178

オブザーバーパターンパブリッシュ/サブスクライブ、およびデータバインディングの違いは何ですか?

Stack Overflowを少し検索しましたが、良い答えは見つかりませんでした。

私が信じるようになったのは、データバインディングは一般的な用語であり、オブザーバーパターンやPub/Subパターンなどのさまざまな実装方法があるということです。オブザーバーパターンを使用すると、Observableはオブザーバーを更新します。Pub / Subを使用すると、0-多くのパブリッシャーが特定のクラスのメッセージをパブリッシュでき、0-多くのサブスクライバーが特定のクラスのメッセージをサブスクライブできます。

「データバインディング」を実装する他のパターンはありますか?

4

4 に答える 4

175

Observer/Observable パターンと Publisher/Subscriber パターンの間には、2 つの大きな違いがあります。

  1. Observer/Observableパターンはほとんどが同期的に実装されます。つまり、何らかのイベントが発生すると、Observable はすべてのオブザーバーの適切なメソッドを呼び出します。パブリッシャー/サブスクライバーパターンは、ほとんどが非同期の方法で (メッセージ キューを使用して) 実装されます。

  2. Observer/Observableパターンでは、オブザーバーは observable を認識しています。一方、パブリッシャー/サブスクライバーでは、パブリッシャーとサブスクライバーがお互いを知る必要はありません。メッセージキューを使用して通信するだけです。

あなたが正しく述べたように、データ バインディングは一般的な用語であり、Observer/Observable または Publisher/Subscriber メソッドを使用して実装できます。データはパブリッシャー/オブザーバブルです。

于 2013-03-24T07:25:38.420 に答える
154

3つについての私の見解は次のとおりです。

データバインディング

本質的に、これは単に「オブジェクト Y のプロパティ X の値が、オブジェクト B のプロパティ A の値に意味的にバインドされている」ことを意味します。Y がオブジェクト B の変更をどのように認識または供給されるかについての仮定は行われません。

オブザーバー、またはオブザーバブル/オブザーバー

特定のイベントを他のユーザーに通知する機能をオブジェクトに吹き込む設計パターン。通常は、特定の関数/メソッドの形をしたオブジェクトのスロットのようなものである実際のイベントを使用して行われます。オブザーバブルは通知を提供する人であり、オブザーバーはそれらの通知を受け取ります。.net では、オブザーバブルはイベントを公開でき、オブザーバーは「イベント ハンドラー」型のフックを使用してそのイベントをサブスクライブします。通知が発生する特定のメカニズムについても、1 つのオブザーバブルが通知できるオブザーバーの数についても、仮定は行われません。

パブ/サブ

オブザーバブル/オブザーバー パターンの別の名前 (おそらく、より「ブロードキャスト」セマンティクスを含む) で、通常はより「動的」なフレーバーを意味します。オブザーバーは通知をサブスクライブまたはサブスクライブ解除でき、1 つのオブザーバブルは複数のオブザーバーに「叫ぶ」ことができます。.NET では、イベントは MulticastDelegate の形式であり、複数のサブスクライバーへのイベントの配信をサポートし、サブスクリプション解除もサポートできるため、これに標準イベントを使用できます。Pub/Sub は、特定のコンテキストでは少し異なる意味を持ちます。通常、イベントとイベンターの間により多くの「匿名性」が含まれます。これは、通常、すべてを知っている何らかの「仲介者」(メッセージ キューなど) を含む、任意の数の抽象化によって促進できます。当事者ですが、個々の当事者はお互いについて知りません。

データバインディング、Redux

多くの「MVC のような」パターンでは、オブザーバブルは、変更された特定のプロパティに関する情報も含む何らかの方法の「プロパティ変更通知」を公開します。オブザーバーは暗黙的であり、通常はフレームワークによって作成され、オブジェクトとプロパティを明確に識別するために何らかのバインディング構文を介してこれらの通知をサブスクライブし、「イベント ハンドラー」は単に新しい値をコピーするだけで、更新または更新ロジックをトリガーする可能性があります。

データ バインディング re Redux

データバインディングの代替実装? わかりました、ここに愚かなものがあります:

  • オブジェクトのバインドされたプロパティを常にチェックするバックグラウンド スレッドが開始されます。
  • そのスレッドがプロパティの値が最後のチェック以降に変更されたことを検出した場合、その値をバインドされたアイテムにコピーします。
于 2013-03-24T07:42:18.823 に答える
34

ここでのすべての回答が、具体的な例を示すことなく、Observer と Pub/Sub のパターンの微妙な違いを説明しようとしていたことに少し面白がっています。ほとんどの読者は、一方が同期で他方が非同期であると読んで、それぞれを実装する方法をまだ知らないに違いありません。

注意すべきことの 1 つは、これらのパターンの目的は、コードを分離しようとすることです。

オブザーバーは、オブジェクト (サブジェクトと呼ばれる) がそれに依存するオブジェクト (オブザーバー) のリストを維持し、状態の変更を自動的に通知する設計パターンです。

オブザーバーパターン

これは、すべての(通常は関数である) をobservable object保持するリストがあることを意味します。observersこのリストをたどって、都合のよいときにこれらの関数を呼び出すことができます。

詳細については、このオブザーバー パターンの例を参照してください。

このパターンは、オブジェクトのデータ変更をリッスンし、それに応じて他の UI ビューを更新する場合に適しています。

しかし、Cons はObservables であり、オブザーバーを保持するために 1 つの配列のみを維持し ます (この例では、配列は ですobserversList)。

notify functionその配列に格納されているすべての関数をトリガーするが 1 つしかないため、更新がトリガーされる方法を区別しません。

さまざまなイベントに基づいてオブザーバー ハンドラーをグループ化したい場合。observersListそれをObject好きなものに変更するだけです

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}

詳細については、この pubsub の例を参照してください。

そして人々はこのバリエーションを と呼んでいpub/subます。したがって、公開した に基づいてさまざまな機能をトリガーできeventsます。

于 2016-07-08T21:15:44.037 に答える
12

私は両方のパターンについてのあなたの結論に同意しますが、私にとっては、同じプロセスにいるときは Observable を使用し、プロセス間シナリオでは Pub/Sub を使用しています。 .

私は他のパターンを知りません。つまり、このタスクに別のパターンが必要になったことはありません。ほとんどの MVC フレームワークとデータ バインディングの実装でさえ、通常内部的にオブザーバーの概念を使用します。

プロセス間通信に興味がある場合は、次のことをお勧めします。

「エンタープライズ統合パターン: メッセージング ソリューションの設計、構築、展開」 - https://www.enterpriseintegrationpatterns.com/

この本には、プロセス間またはクラス間でメッセージを送信する方法に関する多くのアイデアが含まれており、プロセス内通信タスクでも使用できます (より疎結合の方法でプログラミングするのに役立ちました)。

これが役立つことを願っています!

于 2013-03-26T10:29:00.230 に答える