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

时间:2012-08-22 15:36:40

标签: c# java design-patterns

我见过几个Observer模式的例子。

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

请举例说明。

5 个答案:

答案 0 :(得分:2)

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

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

如果观察者需要告知主题某事,也可以使用实施中的引用。

答案 1 :(得分:1)

特别是对于你的上一个问题,给定C#和Java作为编程语言,除了通过引用之外,一个对象如何“知道”另一个对象?

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

答案 2 :(得分:0)

你好Amandeep你可以阅读这篇文章它是非常有意思的,你有GOF的所有设计模式

你有类图,示例代码

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

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

答案 3 :(得分: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();
    }
}

然而,我不喜欢这种方法( 唯一的优点是占用内存更小。),我更喜欢具有单一责任的不同Observer。

    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");
        }
    });

答案 4 :(得分:0)

快速简答

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

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