Head First Design Patterns - Observer Pattern

The Observer Pattern defines a one-to-many dependency between objects so that when one

object changes state, all of its dependents are notified and updated automatically.

The Observer Pattern defines a one-to-many relatioship between objects.

Design Principle

  • Strive for loosely coupled designs between objects that interact

public interface Subject{

  public void registerObserver(Observer o);

  public void removeObserver(Observer o);

  public void notifyObservers();

}

public interface Observer{

  public void update(float temp, float humidity, float pressure);

}

public interface DisplayElement{

  public void display();

}

public class WeatherData implements Subject{

  private ArrayList observers;

  private float temperature;

  private float humidity;

  private float pressure;

  public WeatherData(){

  observers = new ArrayList();

  }

  public void registerObserver(Observer o){

    observers.add(o);

  }

  public void removeObserver(Observer o){

    int i = observers.indexOf(o);

    if(i>=0){

      observers.remove(i);

    }

  }

  public void notifyObservers(){

    for(int i = 0;i<observers.size();i++){

      Observer observer = (Observer)observers.get(i);

      observer.update(temperature, humidity, pressure);

    }

  }

  public void measurementsChanged(){

    notifyObservers();

  }

  public void setMeasurements(float temperature, float humidity, float pressure){

    this.temperature = temperature;

    this.humidity = humidity;

    this.pressure = pressure;

    measurementsChanged();

  }

}

public class CurrentConditionsDisplay implements Observer, DisplayElement{

  private float temperature;

  private float humidity;

  private Subject weatherData;

  public CurrentConditionsDisplay(Subject weatherData){

    this.weatherData = weatherData;

    weatherData.registerObserver(this);

  }

  public void update(float temperature, float humidity, float pressure){

    this.temperature = temperature;

    this.humidity = humidity;

    display();

  }

  public void display(){

    //do something

  }

}

posted @ 2012-04-25 11:33  qiangzhu  阅读(454)  评论(0编辑  收藏  举报