728x90
반응형
Observer Pattern

 

https://refactoring.guru/design-patterns/observer

Observer Pattern은 객체 간의 일대다 의존 관계를 정의하는 디자인 패턴입니다.

어떤 객체(주체, Subject)의 상태가 변하면 그 객체에 의존하는 다른 객체(관찰자, Observer)들이 이를 감지하고

자동으로 업데이트 되도록 하는 패턴입니다.

이를 통해 객체 간의 결합도를 줄이고 유연성과 확장성을 높일 수 있습니다.

 

Observer Pattern에서 주체 객체는 관찰자 객체들의 리스트를 가지고 있습니다.

주체 객체의 상태가 변화면, 관찰자 객체들의 update() 메서드를 호출하여 상태 변화를 알립니다.

이때, 각 관찰자 객체는 자신이 가지고 있는 주체 객체의 상태를 조회하여 업데이트를 수행합니다.

 

Observer Pattern은 Java에서 자주 사용되는 패턴 중 하나이며,

예를 들어 GUI 프로그래밍에서 버튼의 상태 변화를 감지하여 특정 기능을 수행하는 등 다양한 곳에서 적용됩니다.

 

import java.util.ArrayList;
import java.util.List;

interface Observer {
    void update(int temperature, int humidity, double pressure);
}

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

class WeatherData implements Subject {
    private List<Observer> observers;
    private int temperature;
    private int humidity;
    private double pressure;
    
    public WeatherData() {
        this.observers = new ArrayList<>();
    }
    
    public void registerObserver(Observer o) {
        observers.add(o);
    }
    
    public void removeObserver(Observer o) {
        int index = observers.indexOf(o);
        if (index >= 0) {
            observers.remove(index);
        }
    }
    
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature, humidity, pressure);
        }
    }
    
    public void measurementsChanged() {
        notifyObservers();
    }
    
    public void setMeasurements(int temperature, int humidity, double pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }
}

class CurrentConditionsDisplay implements Observer {
    private int temperature;
    private int humidity;
    private double pressure;
    private Subject weatherData;
    
    public CurrentConditionsDisplay(Subject weatherData) {
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }
    
    public void update(int temperature, int humidity, double pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        display();
    }
    
    public void display() {
        System.out.println("Current conditions: " + temperature
                           + "F degrees and " + humidity + "% humidity"
                           + " and " + pressure + " pressure");
    }
}

public class WeatherStation {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
        
        weatherData.setMeasurements(80, 65, 30.4f);
        weatherData.setMeasurements(82, 70, 29.2f);
        weatherData.setMeasurements(78, 90, 29.2f);
    }
}

 

위 코드에서 WeatherData 클래스는 Subject 인터페이스를 구현하며, 

옵저버들을 등록하고 삭제하고 알림을 보내는 역할을 합니다.

CurrentConditionsDisplay 클래스는 Observer 인터페이스를 구현하며, 옵저버로 등록되면 

온도, 습도, 기압을 업데이트하고 디스플레이 메서드를 호출합니다.

마지막으로 WeatherStation 클래스에서는 WeatherData 객체를 생성하고 CurrentConditionsDisplay 객체를 

옵저버로 등록합니다. 그리고 setMeasurements 메서드를 호출하여 온도, 습도, 기압을 업데이트하고, 

이 정보가 변경되면 CurrentConditionsDisplay 객체에게 알립니다.

728x90
반응형

'Language > Java' 카테고리의 다른 글

Factory Method Pattern  (0) 2023.04.14
Singleton Pattern  (0) 2023.04.14
Java - super, super()  (0) 2023.04.13
Java - Code Sample  (0) 2023.04.13
Java - Exception  (0) 2023.03.27

+ Recent posts