객체간 1:다 의존 관계를 정의함.
한 개 객체 상태가 변경될 때, 그 객체와 의존 관계에 있는 모든 객체들이 자동으로 알림을 받고 상태 갱신
1. 푸쉬를 받고자 하는 사용자가 등록
2. 특정 상황이 발생하면 등록된 사용자 모두에게 알리고 자동으로 데이터 갱신
public interface Observer {
public void update(float temperature, float humidity, float pressure);
}
public class CurrentConditionsDisplay implements Observer, DisplayElement{
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.addObserver(this); //등록
}
@Override
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
@Override
public void display() {
System.out.println(""+temperature+" "+ humidity);
}
}
public interface Subject {
public void addObserver(Observer o);
public void notifyObservers();
public void removeObserver(Observer o);
}
public class WeatherData implements Subject{
private ArrayList<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<>();
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
//변경 된다면,
notifyObservers(); //알림
}
@Override
public void addObserver(Observer o) {
observers.add(o);
}
@Override
public void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {
observers.get(i).update(temperature, humidity, pressure);
}
}
@Override
public void removeObserver(Observer o) {
int i= observers.indexOf(o); //객체 존재하는지 확인 하기 위함
if (i>=0){ //존재한다면
observers.remove(i);
}
}
}
public class Main {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
new CurrentConditionsDisplay(weatherData); // 등록
weatherData.setMeasurements(80,65,30.4f);
weatherData.setMeasurements(10,645,3230.4f);
}
}
1. new CurrentConditionsDisplay(weatherData);
: currentConditionDisplay는 weatherData를 구독함 -> add 호출
2. subject의 데이터 변경
3. subject에서 notify 호출
4. observer의 update 호출