WeatherData
public class WeatherData {
private float temperature;
private float humidity;
private float pressure;
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
public void measurementsChanged(){
// 최신 정보로 온도 , 습도 , 압력 Update !
// 첫번째 Display : 정보 전달 !
// 두번째 Display : 정보 전달 !
// 세번째 Display : 정보 전달 !
}
}
주체와 관찰자 두개의 개념이 등장한다.
- 주체 : 데이터를 직접 다루고 상태를 관리하는 객체
- 관찰자(옵저버) : 주체로부터 데이터를 전달받는 객체
옵저버 패턴이란 관찰자들이 주체에 등록되어 주체의 상태 변화 시 주체가 자신에게 등록된 관찰자들에게 정보를 전달하는 디자인 패턴
Observer
Interface
1. Observer
2. Subject
3. DisplayElement
Class
1. WeatherData
2. CurrentConditionsDisplay : 현재 측정값
3. StatisticsDisplay : 평균 값 (X)
4. ForecastDisplay : 기상 예보 (X)
Observer
public interface Observer {
public void update(float temperature,float humidity,float pressure);
}
Subject
public interface Subject {
public void register(Observer observer);
public void remove(Observer observer);
public void notify(Observer observer);
}
DisplayElement
public interface DisplayElement {
public void display();
}
WeatherData
import java.util.ArrayList;
import java.util.List;
public class WeatherData implements Subject{
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
this.observers = new ArrayList<Observer>();
}
@Override
public void register(Observer observer) {
this.observers.add(observer);
}
@Override
public void remove(Observer observer) {
this.observers.remove(observer);
}
@Override
public void notifyObservers() {
for(Observer observer : observers){
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 float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
CurrentConditionsDisplay
package Observer;
public class CurrentConditionsDisplay implements Observer , DisplayElement{
private float temperature;
private float humidity;
private float pressure;
private WeatherData weatherData;
public CurrentConditionsDisplay(WeatherData weatherData){
this.weatherData = weatherData;
weatherData.register(this);
}
@Override
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
@Override
public void display() {
System.out.println("T : "+temperature+" H : "+humidity+" P : "+pressure);
}
}
Push : 주체 → 관찰자
Pull : 관찰자 ← 주체
장난?
엄연히 다른 것이다. Push 방식은 주체가 관찰자에게 정보를 보내는 것이고 Pull 방식은 관찰자가 주체에게서 정보를 받아오는 것이다.
@Override
public void update() {
this.temperature = this.weatherData.getTemperature();
this.humidity = this.weatherData.getHumidity();
this.pressure = this.weatherData.getPressure();
display();
}