在Java中可以观察到
我试图理解观察者和被观察者 下面是一个我想弄明白的例子:在Java中可以观察到,java,oop,design-patterns,observer-pattern,Java,Oop,Design Patterns,Observer Pattern,我试图理解观察者和被观察者 下面是一个我想弄明白的例子: public class IntegerDataBag extends Observable implements Iterable<Integer> { private ArrayList<Integer> list= new ArrayList<Integer>(); public void add(Integer i){ list.add(i);
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");
}
}
}
public类IntegerDataBag扩展了Observable实现Iterable{
private ArrayList list=new ArrayList();
公共void add(整数i){
列表.添加(i);
setChanged();
通知观察员();
}
公共迭代器迭代器(){
return list.iterator();
}
公共整数删除(整数索引){
如果(索引
bag.addObserver()
,因为IntegerDataBag
扩展了Observable
setChanged()
和notifyObservers()
之间有什么区别arg
代表什么?为什么我需要检查o==bag
?为什么我要更新另一个可观察的addObserver
是Observable
抽象类中的一个方法。请参阅Java文档中的可观察的
中的列表中李>
setChanged
之前,对notifyObservators
的调用不会起任何作用Observer
是一种常见的设计模式。通常的例子是当您有一个模型和多个视图时。每个视图都是模型上的观察者;如果模型发生更改,视图将更新setChanged()标记表示对象已更改的对象。notifyObservers负责唤醒所有收听可观察对象的观察者。回答您的问题
addObserver
方法在Observable
中实现
这个观察员被添加到哪里?创造了什么,在哪里
正在将观察者添加到观察者列表中,该列表在Observable
中声明为private,因此它在子类中不可见
setChanged()和notifyObservators()之间有什么不同
当您调用notifyobservators()
而不首先调用setChanged()
时,不会发生任何通知
我不理解更新方法-args代表什么?为什么我需要检查o==bag,为什么我要更新另一个可观察的
一个观察者
可以观察多个观察者
。通过检查update
方法的第一个参数,您可以确定哪个观察者正在通知您一些事情
为什么我需要这个观察员呢
任何时候,您希望一个类向其他类发送事件,但不希望该类直接依赖其观察者。观察者模式类似于侦听器的概念。正在侦听的对象保留其所有侦听器的记录。例如,stock monitor类可能允许对象侦听特定事件,例如库存水平低于警告水平 从观察者的角度来看: 调用
subscribe()
或addEventListener()
等。然后,当事件实际发生时,通常通过调用观察者中的函数(事件处理函数)来“通知”观察者
从被观察者的角度来看:
希望观察可观察对象的对象通过如上所述调用subscribe()
或addEventListener()
来登记其兴趣。因此,可观察对象将这些观察者添加到数组、列表或某些其他数据结构中
一旦事件实际发生,监听器将通过调用Observators类中的事件处理函数得到通知。让我们为Observator模式举一个实际例子:Twitter。有了Twitter,我们可以跟随其他人阅读
private Vector obs;