在 Java 中可观察

我试图理解观察者和可观察者。

下面是一个我试图弄清楚的例子:

public class IntegerDataBag extends Observable implements Iterable<Integer> {

    private ArrayList<Integer> list= new ArrayList<Integer>();

    public void add(Integer i){
        list.add(i);
        setChanged();
        notifyObservers();
    }

    public Iterator<Integer> iterator(){
        return list.iterator();
    }

    public Integer remove (int index){
        if (index< list.size()){
            Integer i = list.remove(index);
            setChanged();
            notifyObservers();
            return i;
        }
        return null;
    }

}

public class IntegerAdder implements Observer {

    private IntegerDataBag bag;

    public IntegerAdder(IntegerDataBag bag) {
        this.bag = bag;
        bag.addObserver(this);
    }

    public void update(Observable o, Object arg) {
        if (o == bag) {
            System.out.println("The contents of the IntegerDataBag have changed");
        }
    }

}
  1. 只能因为扩展而使 ?bag.addObserver()IntegerDataBagObservable

  2. 这个观察者被添加到哪里?正在创建什么,在哪里创建?

  3. 和 有什么区别?setChanged()notifyObservers()

  4. 我不明白方法;代表什么?为什么我需要检查一下?为什么要更新另一个可观察量?updateargo==bag

  5. 为什么我需要这个观察者呢?


答案 1
  1. 是的。 是抽象类中的一个方法。请参阅 Java 文档中的可观察性addObserverObservable
  2. 它将添加到 的列表中。Observable
  3. 在设置之前,对 的调用将不执行任何操作。notifyObserverssetChanged
  4. 同一应用程序中可能有多个可观察量。
  5. Observer是一种常见的设计模式。通常的示例是当您有一个模型和多个视图时。每个视图都是模型上的一个观察者;如果模型发生更改,视图将更新。

答案 2

让我们为观察者模式举一个实际的例子:Twitter。通过Twitter,我们可以关注其他人,并近乎实时地阅读他们发布的任何内容。

每个推特用户都是可观察的。您可以将自己添加为听众(“关注者”)并阅读他/她的帖子。每个推特用户都会做一个“通知关注者”()。notifyObservers

在这里,我们做同样的事情。该类能够在其内部包中添加或删除值时通知其他类。任何实例(实现 )都可以将自身注册到 a,并将通过其回调方法 () 接收消息。IntegerDataBagObserverIntegerDataBagupdate

简而言之,我们执行以下操作:

  1. 观察者(侦听器 )将自身添加到可观察量IntegerAdder (IntegerDataBag)
  2. 可观察对象处发生了一些事情,可观察对象通知其观察者
  3. 可观察对象将调用所有实际观察者的回调方法
  4. 观察者现在已收到事件通知,可以使用它

希望,这个简短的描述有助于理解这种模式。


发布/订阅是类似的模式:发布者就像一个可观察者,订阅者就像一个观察者。另一个实际的例子是:一个人可以订阅报纸,出版商会发送报纸,直到你取消订阅。