208

インタビュアーは私にこう尋ねました:

それらは何でObserverObservableいつ使用する必要がありますか?

私はこれらの用語を知らなかったので、家に帰って と についてグーグルで調べ始めたときObserverObservableさまざまなリソースからいくつかのポイントを見つけました。

1)ObservableはクラスでObserverあり、インターフェースです。

2)Observableクラスは のリストを維持しますObserver

3)Observableオブジェクトが更新されると、そのオブジェクトupdate()のそれぞれのメソッドを呼び出してObserver、変更されたことを通知します。

私はこの例を見つけました:

import java.util.Observable;
import java.util.Observer;

class MessageBoard extends Observable
{
    public void changeMessage(String message) 
    {
        setChanged();
        notifyObservers(message);
    }
}

class Student implements Observer 
{
    @Override
    public void update(Observable o, Object arg) 
    {
        System.out.println("Message board changed: " + arg);
    }
}

public class MessageBoardTest 
{
    public static void main(String[] args) 
    {
        MessageBoard board = new MessageBoard();
        Student bob = new Student();
        Student joe = new Student();
        board.addObserver(bob);
        board.addObserver(joe);
        board.changeMessage("More Homework!");
    }
}

Observerしかし、なぜとObservable?が必要なのかわかりません。setChanged()およびnotifyObservers(message)メソッドは何のためのものですか?

4

10 に答える 10

274

Student と MessageBoard の具体例があります。生徒は、新しいメッセージがメッセージ ボードに投稿されたときに通知を受け取りたいオブザーバーのリストに自分自身を追加して登録します。Message が MessageBoard に追加されると、オブザーバーのリストを繰り返し処理し、イベントが発生したことを通知します。

ツイッターを考えてみてください。誰かをフォローしたいと言うと、Twitter はあなたをそのフォロワー リストに追加します。彼らが新しいツイートを送信すると、それが入力に表示されます。その場合、あなたの Twitter アカウントが Observer で、フォローしている人が Observable です。

Twitter はメディエーターである可能性が高いため、たとえ話が完全ではないかもしれません。しかし、それは要点を示しています。

于 2012-12-06T13:22:24.717 に答える
62

非常に簡単に言えば(他の回答はとにかくすべての公式デザインパターンを参照しているため、詳細についてはそれらを参照してください):

プログラムのエコシステム内の他のクラスによって監視されるクラスが必要な場合は、そのクラスを監視可能にする必要があると言います。つまり、プログラムの残りの部分にブロードキャストしたい状態にいくつかの変更がある可能性があります。

これを行うには、ある種のメソッドを呼び出す必要があります。Observableクラスが、それを監視することに関心のあるクラスと緊密に結合されることは望ましくありません。特定の基準を満たしている限り、誰であるかは関係ありません。(それがラジオ局であると想像してください。彼らが彼らの周波数で調整されたFMラジオを持っている限り、誰が聞いているかは関係ありません)。これを実現するために、オブザーバーと呼ばれるインターフェースを使用します。

したがって、Observableクラスにはオブザーバーのリストが含まれます(つまり、使用している可能性のあるObserverインターフェイスメソッドを実装するインスタンス)。何かをブロードキャストしたいときはいつでも、すべてのオブザーバーでメソッドを次々に呼び出すだけです。

パズルを閉じる最後のことは、Observableクラスが誰が興味を持っているかをどのように知るかということです。したがって、Observableクラスは、オブザーバーが関心を登録できるようにするためのメカニズムを提供する必要があります。オブザーバーをオブザーバーのリストに内部的に追加するなどのメソッドaddObserver(Observer o)により、重要なことが発生すると、リストをループして、リスト内の各インスタンスのオブザーバーインターフェイスのそれぞれの通知メソッドを呼び出します。

java.util.Observerインタビューの中で、彼らはあなたに、そしてjava.util.Observable一般的な概念について明確に尋ねなかったのかもしれません。コンセプトはデザインパターンであり、Javaは、必要なときにすぐに実装できるように、箱から出してすぐにサポートを提供します。したがって、実際のメソッド/クラス(必要なときに検索できる)ではなく、概念を理解することをお勧めします。

アップデート

あなたのコメントに応えて、実際のjava.util.Observableクラスは以下の機能を提供します:

  1. java.util.Observerインスタンスのリストを維持します。通知に関心のある新しいインスタンスは、を介して追加しaddObserver(Observer o)たり、を介して削除したりできますdeleteObserver(Observer o)

  2. 内部状態を維持し、オブザーバーへの最後の通知以降にオブジェクトが変更されたかどうかを指定します。Observableこれは、変更を通知する部分から、変更を通知する部分を分離するので便利です。(たとえば、複数の変更が発生していて、各小さなステップではなく、プロセスの最後にのみ通知する場合に便利です)。これはを介して行われますsetChanged()。つまり、何かをに変更したときにそれを呼び出すだけで、残りの人に最終的にそれについて知ってObservableもらいたいのです。Observers

  3. Observable特定の状態が変化したことをすべてのオブザーバーに通知します。これはを介して行われますnotifyObservers()setChanged()これは、通知を続行する前に、オブジェクトが実際に変更されたかどうか(つまり、への呼び出しが行われたかどうか)をチェックします。Object通知で追加情報を渡したい場合に備えて、2つのバージョンがあります。1つは引数なし、もう1つは引数付きです。内部的には、インスタンスのリストを繰り返し処理し、各インスタンスのメソッドをObserver呼び出すだけです。update(Observable o, Object arg)これは、Observer変更されたObservableオブジェクト(複数を観察している可能性があります)と、Object arg潜在的にいくつかの追加情報を運ぶための追加(パススルー)を示しnotifyObservers()ます。

于 2012-12-06T13:39:17.293 に答える
11

これらはObserver デザイン パターンの一部です。通常、1 人以上のオブザーバーが 1 つのobservableの変更について通知を受けます。これは、「何か」が発生したという通知であり、プログラマーとして「何か」が何を意味するかを定義できます。

このパターンを使用する場合、両方のエンティティを互いに切り離します - オブザーバーはプラグイン可能になります。

于 2012-12-06T13:25:46.673 に答える
10

オブザーバー、別名コールバックはObservableに登録されています。

これは、たとえば、ある時点で発生したイベントについて通知するために使用されます。これは、Swing、Ajax、GWTで、UIイベント(ボタンのクリック、テキストフィールドの変更など)の操作をディスパッチするために広く使用されています。

SwingにはaddXXXListener(Listener l)のようなメソッドがあり、GWTには(Async)コールバックがあります。

オブザーバーのリストは動的であるため、オブザーバーは実行時に登録および登録解除できます。インターフェイスが使用されているため、オブザーバブルをオブザーバブルから切り離すのも良い方法です。

于 2012-12-06T13:32:04.610 に答える
4

ここにオブザーバー パターンの簡単な説明を書きました: http://www.devcodenote.com/2015/04/design-patterns-observer-pattern.html

投稿からの抜粋:

オブザーバー パターン : 基本的に、オブジェクト間に 1 対多の関係を確立し、相互に依存するオブジェクト間に疎結合の設計があります。

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

たとえば、フィード通知サービスについて考えてみましょう。サブスクリプション モデルは、オブザーバー パターンを理解するのに最適です。

于 2015-04-17T03:44:49.763 に答える
1

Java9 以降、どちらのインターフェースも非推奨になっているため、使用しないでください。Java 9 で Observer が非推奨になったことを参照してください。代わりに何を使用する必要がありますか?

ただし、それらについてのインタビューの質問を受ける可能性はあります...

于 2017-12-06T05:31:46.800 に答える