02. Observer Pattern

객체간 1:다 의존 관계를 정의함.
한 개 객체 상태가 변경될 때, 그 객체와 의존 관계에 있는 모든 객체들이 자동으로 알림을 받고 상태 갱신


1. 푸쉬를 받고자 하는 사용자가 등록
2. 특정 상황이 발생하면 등록된 사용자 모두에게 알리고 자동으로 데이터 갱신

  • Subject: add, remove, notify 메서드를 포함함
  • Object: update 포함
  • loose coupling: 그 둘이 상호작용을 하긴 하지만 서로에 대해 잘 모름
  • ISP(인터페이스 분리)

사례 1 – Weather (HFDP Ch. 2)

observer

public interface Observer {
    public void update(float temperature, float humidity, float pressure);
}

CurrentConditionsDisplay

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);
    }

}

subject

public interface Subject {
    public void addObserver(Observer o);
    public void notifyObservers();
    public void removeObserver(Observer o);
}

weather data

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);
        }
    }
}

Main

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 호출

좋은 웹페이지 즐겨찾기