Ich schrieb ein Programm, um mit dem Beobachtermuster zu lernen und zu spielen, aber ich habe Probleme damit, die Daten korrekt auszudrucken. Es sollte die Dateneingabe in den Zeilen 7-9 in der Paste ausdrucken, aber es druckt nur 0,0,0.Warum werden die richtigen Daten nicht empfangen?
Hauptklasse
public class ObserverPattern {
public static void main(String[] args) {
Subject weatherData = new Subject();
weatherData.setTemp(81);
weatherData.setHumidity(14);
weatherData.setWindSpeed(8);
Observer johnsIpad = new Observer(weatherData);
weatherData.notifyObserver();
System.out.println(johnsIpad.toString());
}
}
Gegenstand Klasse
import java.util.ArrayList;
public class Subject {
// fields
ArrayList<Observer> observers;
public double temp;
public double humidity;
public double windSpeed;
// Constructor
public Subject() {
observers = new ArrayList<Observer>();
}
// Observer pattern methods
public void register(Observer o) {
observers.add(o);
}
public void unregister(Observer o) {
observers.remove(observers.indexOf(o));
}
public void notifyObserver() {
for (Observer observer : observers) {
observer.update(temp, humidity, windSpeed);
}
}
// set weather data
public void setTemp(double temp) {
this.temp = temp;
}
public void setHumidity(double humidity) {
this.humidity = humidity;
}
public void setWindSpeed(double windSpeed) {
this.windSpeed = windSpeed;
}
}
Observer Klasse
public class Observer {
double temp;
double humidity;
double windSpeed;
Subject weatherData;
Observer(Subject weatherDataSource) {
weatherData = weatherDataSource;
}
public void update(double temp, double humidity, double windSpeed) {
this.temp = temp;
this.humidity = humidity;
this.windSpeed = windSpeed;
}
public String toString() {
return temp + "\n" + humidity + "\n" + windSpeed;
}
}
Sie haben Recht. Ich habe es dem Konstruktor hinzugefügt. Als Nebenbemerkung, wenn Sie es entweder so machen, wie Sie es getan haben oder im Konstruktor, hätte das unterschiedliche Konsequenzen. Im Konstruktor bedeutet dies, dass es jedes Mal automatisch passiert, was nicht wünschenswert ist. Wenn es jedoch nicht im Konstruktor ist und Sie es nicht jedes Mal wollen, dann wäre es leicht zu vergessen, es zu registrieren. Es hängt wahrscheinlich davon ab, wie oft Sie es am Anfang registrieren möchten. – Supetorus
Nein. Fügen Sie sie dem Konstruktor nicht hinzu. Ich habe oben mit mehreren Gründen gesagt, warum das eine schlechte Idee ist. –
(Wenn ich "oben" sage, beziehe ich mich auf [OPs Antwort] (http://stackoverflow.com/a/38316898/3788176)). –