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)
该bag.addObserver()
可制成只是因为IntegerDataBag
延伸Observable
?
这个观察者在哪里被添加?什么是创造和在哪里?
setChanged()
和之间有什么区别notifyObservers()
?
我不明白这个update
方法; 什么arg
代表什么?为什么我需要检查o==bag
?为什么我要更新另一个observable?
为什么我还需要这个观察者呢?
S.L*_*ica 10
addObserver
是Observable
抽象类中的方法.请参阅Java文档中的Observable.Observable
.notifyObservers
之前,调用将不执行任何操作setChanged
.Observer
是一种常见的设计模式.通常的例子是你有一个模型和多个视图.每个视图都是模型的观察者; 如果模型更改,则视图会更新.让我们来看一个Observer模式的实例:Twitter.通过Twitter,我们可以关注其他人并阅读他们近乎实时发布的内容.
每个Twitter用户都是可观察的.您可以将自己添加为听众("追随者")并阅读他/她的帖子.每个Twitter用户都会做一个"通知追随者"(notifyObservers
).
在这里我们也这样做.IntegerDataBag
只要在内部包中添加或删除值,该类就能够通知其他类.任何实例(实现Observer
)都可以将自己注册到a IntegerDataBag
并通过它的回调方法(update
)接收消息.
简而言之,我们执行以下操作:
IntegerAdder
)增加了自身的可观察到的(IntegerDataBag
)希望,这个简短的描述有助于理解这种模式.
发布/订阅是一种类似的模式:发布者就像一个观察者,一个像观察者一样的订阅者.另一个实际例子:一个人可以订阅一份报纸,发行商会发送论文直到您取消订阅.
bag.addObserver()只能因IntegerDataBag扩展Observable而生成?
正确,Observable
是一个有addObserver()
方法的类.
这个观察者在哪里被添加?创造什么,在哪里?
的Observer
类包含一个List
或Vector
(在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
.
为什么我还需要这个观察者呢?
要创建一个Listener
for事件驱动的场景,即如果您希望在更改可观察对象时获得通知,则需要Observer.
阅读:GoF - 观察者模式.
归档时间: |
|
查看次数: |
10709 次 |
最近记录: |