首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的可观察性

Java中的可观察性
EN

Stack Overflow用户
提问于 2011-09-01 21:30:45
回答 9查看 11.6K关注 0票数 16

我正在尝试理解观察者和观察者。

下面是我想要弄明白的一个例子:

代码语言:javascript
复制
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");
        }
    }

}

只有因为Observable

  • Where扩展了,才能创建
  1. bag.addObserver()。这个观察者是不是要添加到?正在创建什么,在哪里创建?
  2. setChanged()update之间的区别是什么不理解arg方法;arg代表什么?为什么我需要检查那个o==bag?我为什么要更新另一个观察者?
  3. 我到底为什么需要这个观察者?
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-09-01 21:38:16

  1. 是。addObserverObservable抽象类中的一个方法。参见Java documentation.
  2. It中的Observable被添加到Observable中的列表。
  3. 在设置setChanged之前,对notifyObservers的调用不会执行任何操作。
  4. 在同一应用程序中可能有多个可观察对象。
  5. Observer是一种常见的设计模式。通常的例子是当你有一个模型和多个视图时。每个视图都是模型上的一个观察者;如果模型发生更改,视图也会更新。
票数 10
EN

Stack Overflow用户

发布于 2011-09-01 21:46:43

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

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

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

简而言之,我们做了以下工作:

监听器观察者( (IntegerDataBag)

  • Something,

  • )将自己添加到可观察对象中发生在可观察对象上,并且该可观察对象通知其监听对象将调用所有实际侦听器观察者的回调方法现在已收到该事件的通知,并可以使用它

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

发布/订阅是一种类似的模式:发布者类似于可观察者,订阅者类似于观察者。还有另一个实际的例子:一个人可以订阅一份报纸,出版商会把报纸寄出去,直到你取消订阅。

票数 6
EN

Stack Overflow用户

发布于 2011-09-01 21:47:40

bag.addObserver()只能是因为IntegerDataBag扩展了Observable?

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

这个观察者被添加到哪里?在哪里创建了什么?

Observer类包含Observable对象的ListVector (在JDK源代码中)。

代码语言:javascript
复制
private Vector obs;

那是它存储的地方。

和有什么不同

setChanged()只是标记Observable已更改。只有当setChanged设置为true时,notifyObservers()才会调用列表中的所有观察者为update() (将更改后的对象传递给观察者)。

我不理解update方法-- args代表什么?为什么我需要检查那个o==bag,为什么我要更新另一个观察值?

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

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

要为事件驱动的场景创建观察者,也就是说,如果您希望在可观察对象的更改中得到通知,则需要Listener

阅读: GoF - Observer pattern

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7271044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档