3

我见过几个观察者模式的例子。

为什么 Observer 接口中的 update 方法在某些情况下会包含对被观察对象的引用?观察者不知道它在观察什么物体吗?

请举例说明。

4

5 回答 5

2

根据具体问题,它可能有也可能没有对主题的引用。

Subject 可能只调用 update() 函数并在 Observer 中设置一些值,因此 Observer 不需要引用。或者它可以通知观察者发生了变化,观察者将通过它拥有的引用联系主题并获取新的值。

如果观察者需要通知主题一些事情,也可以在实现中使用引用。

于 2012-08-22T15:43:06.803 回答
1

具体到您的最后一个问题,考虑到 C# 和 Java 作为编程语言,一个对象如何“知道”另一个对象,除了通过引用?

观察者和主体之间的关系需要存储在某个地方,并且在 Java 和 C# 中,如果需要对主体或观察者调用任何操作,则只能通过引用存储。

于 2012-08-22T16:31:51.193 回答
0

您好 Amandeep,您可以阅读这篇文章,非常有趣,您拥有 GOF 的所有设计模式

你有类图,示例代码

它解释了关于观察的所有概念:Subject, ConcreteSubject, Observer 和 ConcreteObserver

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

于 2012-08-22T15:38:39.550 回答
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

快速简短的回答

观察者模式可以有多种变体。

其中之一只允许检测观察对象的变化,并可能显示它们的属性值。其他也允许执行操作。

于 2012-08-22T17:03:19.150 回答