我正在尝试理解观察者和观察者。
下面是我想要弄明白的一个例子:
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
bag.addObserver()
。这个观察者是不是要添加到?正在创建什么,在哪里创建?setChanged()
和update
之间的区别是什么不理解arg
方法;arg
代表什么?为什么我需要检查那个o==bag
?我为什么要更新另一个观察者?发布于 2011-09-01 21:38:16
addObserver
是Observable
抽象类中的一个方法。参见Java documentation.Observable
中的列表。setChanged
之前,对notifyObservers
的调用不会执行任何操作。Observer
是一种常见的设计模式。通常的例子是当你有一个模型和多个视图时。每个视图都是模型上的一个观察者;如果模型发生更改,视图也会更新。发布于 2011-09-01 21:46:43
让我们举一个观察者模式的实际例子: Twitter。有了Twitter,我们可以关注其他一些人,几乎实时地阅读他们发布的任何内容。
每个twitter用户都是可以观察到的。您可以将自己添加为听众(“关注者”)并阅读他/她的帖子。每个twitter用户都会做一个“通知追随者”(notifyObservers
)。
在这里我们也做同样的事情。无论何时向其内部包添加或删除一个值,类IntegerDataBag
都能够通知其他类。任何实例(实现Observer
)都可以将自身注册到IntegerDataBag
,并通过其回调方法(update
)接收消息。
简而言之,我们做了以下工作:
监听器观察者( (IntegerDataBag
)
希望,这篇简短的描述有助于理解这种模式。
发布/订阅是一种类似的模式:发布者类似于可观察者,订阅者类似于观察者。还有另一个实际的例子:一个人可以订阅一份报纸,出版商会把报纸寄出去,直到你取消订阅。
发布于 2011-09-01 21:47:40
bag.addObserver()只能是因为IntegerDataBag扩展了Observable?
正确,Observable
是一个具有addObserver()
方法的类。
这个观察者被添加到哪里?在哪里创建了什么?
Observer
类包含Observable
对象的List
或Vector
(在JDK源代码中)。
private Vector obs;
那是它存储的地方。
和有什么不同
setChanged()
只是标记Observable
已更改。只有当setChanged
设置为true时,notifyObservers()
才会调用列表中的所有观察者为update()
(将更改后的对象传递给观察者)。
我不理解update方法-- args代表什么?为什么我需要检查那个o==bag,为什么我要更新另一个观察值?
update()
方法告诉Observer
它需要根据收到的更改后的obj
进行更新。这由Observable
中的notifyObservers()
调用。
我为什么需要这个观察者?
要为事件驱动的场景创建观察者,也就是说,如果您希望在可观察对象的更改中得到通知,则需要Listener
。
阅读: GoF - Observer pattern。
https://stackoverflow.com/questions/7271044
复制相似问题