Java 尝试创建侦听器模式样式类时,Observators赢了';我得不到通知
我现在正在学习听者或观察者可观察的设计模式, 我尝试使用提供的Java库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
Observer
接口和Observable
类实现自己的类
MyObservable
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()
业务,因为它没有做你认为它正在做的事情,不管它是什么,它都在错误的地方。所有通知调用都应来自可观察对象内。同样,您的代码完成了一半。