Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 지식 보관소

Observer Pattern / 옵저버 패턴 본문

디자인 패턴

Observer Pattern / 옵저버 패턴

야식은진리다 2021. 4. 7. 17:29

옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의합니다.

이러한 일대다 관계는 주제(subject)의 상태가 바뀌면 옵저버(observer)에 연락이 가는 방식에 의존합니다. 연락 방식에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있습니다.

 

옵저버 패턴을 구현하는 방법은 여러 가지가 있지만 대부분 주제 인터페이스와 옵저버 인터페이스가 들어있는 클래스 디자인을 바탕으로 구현합니다. 

 

//CurrentconditionsDisplay.java

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(){
        System.out.println("Current conditions: " + temperature + "F dgrees and " + humidity + "% humidity");
    }
}

 

//DisplayElement.java

public interface DisplayElement{
    public void display();
}

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

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

 

//WeatherData.java

import java.util.ArrayList;

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

 

//WeatherStation.java

public class WeatherStation {
    public static void main(String[] args){
        WeatherData weatherData = new WeatherData();

        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);

        weatherData.setMeasurements(80, 65, 30.4f);
        weatherData.setMeasurements(82, 70, 29.2f);
        weatherData.setMeasurements(78, 90, 29.2f);
    }
}

'디자인 패턴' 카테고리의 다른 글

SOLID 원칙  (0) 2020.08.18
Strategy Pattern / 전략 패턴  (0) 2020.08.14
Singleton Pattern / 싱글톤 패턴  (0) 2020.02.02