Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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 尝试创建侦听器模式样式类时,Observators赢了';我得不到通知_Java_Design Patterns_Listener - Fatal编程技术网

Java 尝试创建侦听器模式样式类时,Observators赢了';我得不到通知

Java 尝试创建侦听器模式样式类时,Observators赢了';我得不到通知,java,design-patterns,listener,Java,Design Patterns,Listener,我现在正在学习听者或观察者可观察的设计模式, 我尝试使用提供的Java库Observer接口和Observable类实现自己的类 MyObservablesubject是一个空类,它扩展了Observable 以下是我的两个Observer课程: public class CatObserver implements Observer { private String status = "Sleeping..."; @Override public void update

我现在正在学习听者或观察者可观察的设计模式, 我尝试使用提供的Java库
Observer
接口和
Observable
类实现自己的类

My
Observable
subject是一个空类,它扩展了Observable

以下是我的两个
Observer
课程:

public class CatObserver implements Observer {
    private String status = "Sleeping...";
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Updated!");
        this.status = "Awake!";
    }

    public void getStatus(){
        System.out.println(status);
    }
}

public class DogObserver implements Observer {
    private String status = "Sleeping...";
    @Override
    public void update(Observable o, Object arg) {
        this.status = "Awake!";
    }

    public void getStatus(){
        System.out.println(status);
    }
}
这是我的
main
程序:

public class Listener {
    public static void main(String[] args) {
        AnimalSubject subject = new AnimalSubject();

        CatObserver mitsy = new CatObserver();
        DogObserver ozil = new DogObserver();

        mitsy.getStatus();
        ozil.getStatus();

        subject.addObserver(mitsy);
        subject.addObserver(ozil);

        synchronized (subject){
            subject.notifyAll();
        }

        mitsy.getStatus();
        ozil.getStatus();

    }
我的输出是4行“睡眠…”,而它应该是2行“睡眠…”和2行“醒来!”

调试时,它甚至不会进入
update()
函数


这里我做错了什么?

您的代码只完成了一半,因为您没有在我们可以看到的任何地方使用Observable类。观察者/可观察接口/类对不能与对象的
notifyAll()
一起使用。相反,您必须创建一个扩展可观察抽象类的类,然后在适当的时候调用可观察对象的适当notify方法,
NotifyObservators(…)

编辑:我现在看到您正在使用Observable,但是您没有显示代码,而是声明它是空的。显示您的代码,并将其设置为“非空”,实际上,当上述方法的状态发生变化时,您可以调用该方法

类似于

import java.util.*;

public class Listener {
   public static void main(String[] args) {
      AnimalSubject subject = new AnimalSubject("My Dog");

      DogObserver ozil = new DogObserver();

      ozil.getStatus();

      subject.addObserver(ozil);

      subject.setStatus(Status.AWAKE);
      subject.setStatus(Status.EATING);

      ozil.getStatus();

   }

}

class DogObserver implements Observer {
   private Status status = Status.ASLEEP;

   @Override
   public void update(Observable o, Object arg) {
      status = ((StatusEvent) arg).getNewValue();
      getStatus();
   }

   public void getStatus() {
      System.out.println("Status: " + status);
   }
}

class AnimalSubject extends Observable {
   private String name;
   private Status status = Status.ASLEEP;

   public AnimalSubject(String name) {
      this.name = name;
   }

   public void setStatus(Status status) {
      Status oldValue = this.status;
      Status newValue = status;
      if (oldValue.equals(newValue)) {
         return;
      }
      this.status = status;
      StatusEvent event = new StatusEvent(this, oldValue, newValue);
      setChanged();
      notifyObservers(event);
   }

   public Status getStatus() {
      return status;
   }

   public String getName() {
      return name;
   }
}


enum Status {
   ASLEEP, AWAKE, EATING
}

class StatusEvent {
   private Object source;
   private Status oldValue;
   private Status newValue;

   public StatusEvent(Object source, Status oldValue, Status newValue) {
      this.source = source;
      this.oldValue = oldValue;
      this.newValue = newValue;
   }

   public Object getSource() {
      return source;
   }

   public Status getOldValue() {
      return oldValue;
   }

   public Status getNewValue() {
      return newValue;
   }

}

我创建了一个空类(
AnimalSubject
),它只扩展了
Observable
类,我想这就是我想要一个
Observable
类所需要的一切。@argamanza:不,它不能是空的。当其状态发生变化时,它必须通知其内部观察员名单。并且摆脱
notifyAll()
业务,因为它没有做你认为它正在做的事情,不管它是什么,它都在错误的地方。所有通知调用都应来自可观察对象内。同样,您的代码完成了一半。