观察者设计模式的更新方法

3

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

为什么有些情况下Observer接口中的update方法包括对被观察对象的引用? 难道观察者不知道它正在观察哪个对象吗?

请举例说明。


我同意这不是常见的。特别是因为观察者的update()方法通常是由可观察对象调用的,当它需要通知其状态更改时。你能发一下让你产生疑问的例子吗? - kothvandir
5个回答

2

具体问题而定,它可能会或可能不会引用主题。

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

在实现中持有引用还可以用于观察者需要通知主题关于某些事情。


1
具体来说,针对您最后一个问题,如果使用C#和Java作为编程语言,除了通过引用,一个对象如何“知道”另一个对象呢?
观察者和主题之间的关系需要存储在某个地方,在Java和C#中只能通过引用进行存储,如果需要对主题或观察者执行任何操作。

不错。有时候,编程语言的语法和语义可能会改变设计模式的实现方式。 - umlcat

0
一个观察者可以观察多个可观察对象,因此当它被通知时,可以以特定的方式处理更改。例如:
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");
        }
    });

0

你好,Amandeep,你可以阅读这篇文章,它非常有趣,包含了GOF的所有设计模式。

你将看到类图和示例代码。

它解释了关于观察者模式的所有概念:主题、具体主题、观察者和具体观察者。

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


0

简短回答

观察者模式有几种变体。

其中一种只允许检测被观察对象的更改,并可能显示它们的属性值。其他变体还允许执行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接