尝试创建侦听器模式样式 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;
}
}
我现在正在学习 Listener 或 Observer-Observable 设计模式,
我尝试使用提供的 Java 库 Observer
接口和 Observable
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;
}
}