jeudi 8 février 2018

Implement notifyObservers(dataObject) using Java built in Observer Pattern

I am trying to implement and use Java's built in Observer Pattern. I see that the Java.util.Observable has take care of adding and removing Observers but using its addObserver(Observer); and removeObserver(Observer).

The question is regarding notifyObserver. I see this method is overloaded as below:

    //Methods in Observable class
    notifyObservers();            
    notifyObservers(dataObject); // This version takes a data object and passes it as argument to 'Object' parameter as below to my update implementation in Observer class.


    //Implementation in Observer class
    update(Observable obs, Object o)

If I do not pass a dataObject, and just call notifyObserver(), I consider this as a pull request in my Observer class and write the implementaton to pull the information from Observable (below code).

Can you please provide an example of passing dataObject an example of what dataObject need to be passed if I have to call notifyObserver(dataObject) instead and what should my update(Observalbe obs, Object o) implementation look like - Basically I want to push the details to Observer from Observalbe.

Hear is my code so far.. It uses notifyObservers();

//Observable class - WeatherData.java

package observerpattern;

import java.util.Observable;

public class WeatherData extends Observable {

private float temperature;
private float humidity;
String testString = "test";

//Pull Data
public void updateObservers(){
    setChanged();
    notifyObservers();

}

public void setMesurments(float temp, float humidity){
    this.temperature = temp;
    this.humidity = humidity;

    updateObservers();                  //Pull data
}


public float getTemperature() {
    return temperature;
}
public void setTemperature(float temperature) {
    this.temperature = temperature;
}
public float getHumidity() {
    return humidity;
}
public void setHumidity(float humidity) {
    this.humidity = humidity;
}


} // End of Class

Below is my Observer Class: Observer.java

package observerpattern;

import java.util.Observable;

public class Observer implements java.util.Observer {

private float temperature;
private float humidity;
Observable observable;

public Observer(Observable obs){
    this.observable = obs;
    obs.addObserver(this);
}

@Override
public void update(Observable obs, Object dataObject) {

    if(null == dataObject){
        if(obs instanceof WeatherData){
            WeatherData weatherData = (WeatherData)obs;

            this.temperature = weatherData.getTemperature();
            this.humidity = weatherData.getHumidity();

            display();
        }
    }
}

public void display(String str){
    System.out.println(str);
}

public void display(){
    System.out.println(this);
}

@Override
public String toString() {
    return "Observer [temperature=" + temperature + ", humidity=" + humidity + "]";
}

}//End of Observer Class

Observer Pattern test: ObserverPatternSimulator.java

package observerpattern;

import java.util.Observable;

public class ObserverPatternSimulator {

public static void main(String[] args) {


    WeatherData obs = new WeatherData();

    Observer observer = new Observer(obs);

    obs.setMesurments(20.2f, 30.0f);

}

}

Just to reiterate, the program works fine, prints me output.

output: Observer [temperature=20.2, humidity=30.0]

The question is, can you please provide an example of how to use notifyObservers(Object dataObject) and how the update(Observable obs, Object o) would be implemented.

Aucun commentaire:

Enregistrer un commentaire