Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中可以观察到_Java_Oop_Design Patterns_Observer Pattern - Fatal编程技术网

在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
    是一种常见的设计模式。通常的例子是当您有一个模型和多个视图时。每个视图都是模型上的观察者;如果模型发生更改,视图将更新
  • 只能创建bag.addObserver(),因为IntegerDataBag扩展了 可观察到

    2.该观察员将被添加到何处?创造了什么,在哪里

    进入相关的可观察类,您的类正在扩展该类

    4.我不理解更新方法-args代表什么

    当观察到的对象的状态发生变化时,将调用它。 args是传递给nofityObserver的参数

    为什么我需要检查o==bag,为什么我要更新另一个 可观察到

    你不需要检查任何东西

    5.我为什么需要这个观察员

    这是一个非常有用的设计模式。看看维基百科

    编辑: 我没有抓住要点:

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


    setChanged()标记表示对象已更改的对象。notifyObservers负责唤醒所有收听可观察对象的观察者。

    回答您的问题

  • 是的,你说得对

  • 观察者被添加到可观察对象中维护的列表中

  • 在通知观察者之前,需要调用setChanged(),否则他们不会知道对象已更改。调用notifyObservators()后,将通知所有OBVSERER更改。如果您不先调用setChanged,则不会通知您的观察者

  • arg是您在调用notifyobservators(arg)时希望传递给观察者的任何内容

  • 只能创建bag.addObserver(),因为IntegerDataBag扩展了Observable

    是的,
    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;