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.
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.
具体的な問題に応じて、サブジェクトへの参照がある場合とない場合があります。
サブジェクトは update() 関数を呼び出すだけで、オブザーバーに値を設定するだけなので、オブザーバーは参照を必要としません。または、オブザーバーに変更があったことを通知できます。オブザーバーはサブジェクトが持っている参照によってサブジェクトに連絡し、新しい値を取得します。
オブザーバーがサブジェクトに何かを通知する必要がある場合は、実装で参照を保持することもできます。
具体的には、プログラミング言語として C# と Java が与えられた場合、あるオブジェクトが別のオブジェクトについてどのように「知る」ことができますか?
オブザーバーとサブジェクトの間の関係はどこかに保存する必要があり、Java と C# では、サブジェクトまたはオブザーバーのいずれかでアクションを呼び出す必要がある場合、参照を介してのみ保存できます。
多くの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");
}
});
クイック ショート アンサー
オブザーバー パターンにはいくつかのバリエーションがあります。
そのうちの 1 つは、観測されたオブジェクトの変更を検出することだけを許可し、おそらくそれらのプロパティ値を表示します。その他の操作も実行できます。
こんにちは、Amandeep さん、この記事を読むことができます。非常に興味深い内容です。GOF のすべての設計パターンがあります。
クラス図、サンプルコードがあります
観察に関するすべての概念を説明しています: Subject、ConcreteSubject、Observer、ConcreteObserver