Java/Design Pattern

[헤드퍼스트 디자인 패턴] 2. 옵저버 패턴

noahkim_ 2024. 12. 16. 17:44

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. 옵저버 패턴

  • 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 자동으로 통보되고, 변경 내용을 반영할 수 있도록 하는 디자인패턴
  • 일대다 형식으로 객체간 관계를 정의합니다.

 

요소

Subject
  • 상태 관리
    • 상태가 변경될 때, 이를 옵저버들에게 통보
  • 옵저버 관리

 

Observer
  • Subject에 의존
  • Subject의 상태 변화에 반응

 

느슨한 결합

  • 서로 강하게 연결되어 있지 않지만, 상호작용 할 수 있는 관계

 

추상화
  • Subject는 Observer 인터페이스만 의존
  • 서로의 세부 구현 몰라도 됨

 

유연성
  • 변경 및 추가가 쉬움
  • 코드 변경이 일어나도 서로에게 영향 없음 

 

재사용성
  • Subject와 Observer는 서로 독립적으로 재사용 가능

 

사용

  • 이벤트 기반 프로그래밍
  • 발행-구독 모델

 

1. 가상 모니터링 애플리케이션

WeatherData 

public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}
public class WeatherDate implements Subject {
    private List<Observer> observers;
    private float temperatures;
    private float humidity;
    private float pressure;
    
    public WeatherDate() { this.observers = new ArrayList<>(); }
    
    public void registerObserver(Observer o) { observers.add(o); }
    public void removeObserver(Observer o) { observers.remove(o); }
    public void notifyObservers() { 
    	for (Observer observer : observers) {
        	observer.update(temperature, humidity, pressure); 
        }        	
    }

    public int measurementsChanged() { notifyObservers(); }
    
    public void setMeaturements(float temperature, float humidity, float pressure) {
    	this.temperature = temperature;
       	this.humidity = humidity;
        this.pressure = pressure;
        
        measurementsChanged();
    }
}
  • 센서로부터 오는 데이터를 추적
  • 새로운 데이터가 들어올 때마다 measurementsChange()가 호출됨

 

Sensor

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

 

public class CurrentConditionsDisplay implements Observer, DisplayElement {
    private float temperature;
    private float humidity;
    private WeatherData weatherData;
    
    public CurrentConditionsDisplay(WeatherData 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("현재상태: 온도 " + temperature + "F, 습도 " + humidity + "%");
    }
}