尝试创建侦听器模式样式 class,观察者将不会收到通知

Trying to create a Listener pattern style class, observers won't get notified

我现在正在学习 Listener 或 Observer-Observable 设计模式, 我尝试使用提供的 Java 库 Observer 接口和 Observable class.

实现我自己的 class

我的 Observable 主题是空的 class extends Observable

这是我的两个 Observer classes:

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行"Sleeping...",而应该是2行"Sleeping..."和2行"Awake!"。

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

我做错了什么?

您的代码只完成了一半,因为您没有在我们可以看到的任何地方使用 Observable class。 Observer/Observable interface/class 对不适用于对象的 notifyAll()。相反,您必须创建一个扩展 Observable 抽象 class 的 class,然后在适当的时候调用 Observable 的正确通知方法 notifyObservers(...)

编辑:我现在看到您正在使用 Observable,但您没有显示代码,而是声明它是空的。显示您的代码,并使其成为 "non-empty" 实际上,当它的状态发生变化时您会调用上面的方法。

类似...

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;
   }

}