用Java观察

Num*_*tor 16 java oop design-patterns observer-pattern

我正在尝试理解Observer和Observable.

这是我想要弄清楚的一个例子:

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

}
Run Code Online (Sandbox Code Playgroud)
  1. bag.addObserver()可制成只是因为IntegerDataBag延伸Observable

  2. 这个观察者在哪里被添加?什么是创造和在哪里?

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

  4. 我不明白这个update方法; 什么arg代表什么?为什么我需要检查o==bag?为什么我要更新另一个observable?

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

S.L*_*ica 10

  1. 是.addObserverObservable抽象类中的方法.请参阅Java文档中的Observable.
  2. 它被添加到列表中Observable.
  3. 在设置notifyObservers之前,调用将不执行任何操作setChanged.
  4. 您可能在同一个应用程序中有多个Observable.
  5. Observer是一种常见的设计模式.通常的例子是你有一个模型和多个视图.每个视图都是模型的观察者; 如果模型更改,则视图会更新.


And*_*s_D 6

让我们来看一个Observer模式的实例:Twitter.通过Twitter,我们可以关注其他人并阅读他们近乎实时发布的内容.

每个Twitter用户都是可观察的.您可以将自己添加为听众("追随者")并阅读他/她的帖子.每个Twitter用户都会做一个"通知追随者"(notifyObservers).

在这里我们也这样做.IntegerDataBag只要在内部包中添加或删除值,该类就能够通知其他类.任何实例(实现Observer)都可以将自己注册到a IntegerDataBag并通过它的回调方法(update)接收消息.

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

  1. 观察者(监听器,IntegerAdder)增加了自身的可观察到的(IntegerDataBag)
  2. 事情发生在观察到的观察的通知其观察员
  3. 观察到的将调用一切实际的回调方法观察
  4. 观察员目前已收到活动通知,并可以使用它

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


发布/订阅是一种类似的模式:发布者就像一个观察者,一个像观察者一样的订阅者.另一个实际例子:一个人可以订阅一份报纸,发行商会发送论文直到您取消订阅.


Buh*_*ndi 5

bag.addObserver()只能因IntegerDataBag扩展Observable而生成?

正确,Observable是一个有addObserver()方法的类.

这个观察者在哪里被添加?创造什么,在哪里?

Observer类包含一个ListVector(在JDK源)Observable对象.

private Vector obs;
Run Code Online (Sandbox Code Playgroud)

这就是它存储的地方.

setChanged()和之间有什么不同notifyObservers()

setChanged()刚刚标志着Observable改变.该notifyObservers()只是调用它的列表上的所有观察者update()(传递改变的对象为观察员)仅当setChanged设置为true.

我不明白更新方法 - args代表什么?为什么我需要检查o == bag,为什么我要更新另一个observable?

update()方法告诉Observer它需要根据obj收到的更改进行更新.这是由notifyObservers()from 调用的Observable.

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

要创建一个Listenerfor事件驱动的场景,即如果您希望在更改可观察对象时获得通知,则需要Observer.

阅读:GoF - 观察者模式.