3

I have seen few examples of Observer pattern.

Why does the update method in the Observer interface in some cases include a reference to the object being observed? Doesn't the observer know what object it is observing?

Please explain with example.

4

5 に答える 5

2

具体的な問題に応じて、サブジェクトへの参照がある場合とない場合があります。

サブジェクトは update() 関数を呼び出すだけで、オブザーバーに値を設定するだけなので、オブザーバーは参照を必要としません。または、オブザーバーに変更があったことを通知できます。オブザーバーはサブジェクトが持っている参照によってサブジェクトに連絡し、新しい値を取得します。

オブザーバーがサブジェクトに何かを通知する必要がある場合は、実装で参照を保持することもできます。

于 2012-08-22T15:43:06.803 に答える
1

具体的には、プログラミング言語として C# と Java が与えられた場合、あるオブジェクトが別のオブジェクトについてどのように「知る」ことができますか?

オブザーバーとサブジェクトの間の関係はどこかに保存する必要があり、Java と C# では、サブジェクトまたはオブザーバーのいずれかでアクションを呼び出す必要がある場合、参照を介してのみ保存できます。

于 2012-08-22T16:31:51.193 に答える
0

多くのObserverことを観察できるObservableので、通知を受け取ると、特定の方法で変更を処理できます。例えば ​​:

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

public class ObserverSample {
    static class ObservableExtension extends Observable {
        void doSomething() {
            setChanged();
            notifyObservers();
            clearChanged();
        }
    }

    public static void main(final String[] args) {
        final ObservableExtension observable1 = new ObservableExtension();
        final Observable observable2 = new ObservableExtension();
        final Observer observer = new Observer() {
            @Override
            public void update(final Observable o, final Object arg) {
                if (o == observable1)
                    System.out.println("This is the first observable");
                else if (o == observable1)
                    System.out.println("This is the second observable");
                else
                    System.out.println("This is another observable");
            }
        };
        observable1.addObserver(observer);
        observable2.addObserver(observer);
        observable1.doSomething();
    }
}

ただし、私はこのアプローチが好きではありません (唯一の利点はメモリ フットプリントが小さいことです)。単一の責任を持つ異なるオブザーバーを使用することを好みます。

    observable1.addObserver(new Observer() {
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("This is the first observable");
        }
    });
    observable2.addObserver(new Observer() {
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("This is the second observable");
        }
    });
于 2012-08-22T15:50:21.793 に答える
0

クイック ショート アンサー

オブザーバー パターンにはいくつかのバリエーションがあります。

そのうちの 1 つは、観測されたオブジェクトの変更を検出することだけを許可し、おそらくそれらのプロパティ値を表示します。その他の操作も実行できます。

于 2012-08-22T17:03:19.150 に答える
0

こんにちは、Amandeep さん、この記事を読むことができます。非常に興味深い内容です。GOF のすべての設計パターンがあります。

クラス図、サンプルコードがあります

観察に関するすべての概念を説明しています: Subject、ConcreteSubject、Observer、ConcreteObserver

http://www.dofactory.com/Patterns/PatternObserver.aspx

于 2012-08-22T15:38:39.550 に答える