옵저버 패턴 (Observer Pattern)

로롱이·2022년 7월 25일
0

옵저버 패턴

  • 객체의 상태 변화를 관찰하는 옵저버(관찰자)들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 notify를 통해 객체가 직접 목록의 각 옵저버에 통지하도록 하는 디자인 패턴
  • 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다.
  • 자바 스윙에서는 옵저버 대신 리스너라는 용어 사용

옵저버 패턴은 (Model-View-Controller, MVC) 패러다임과 자주 결합된다. 옵저버 패턴은 Model과 View 사이에서 느슨히 연결하기 위해 사용된다.

수정된 데이터 반영하는 부분에서 옵저버 패턴을 구현하면 느슨하게 객체들을 결합할 수 있다.

기상 모니터링 애플리케이션

문제점

public class WeatherData {

	private CurrentConditionsDisplay currentConditionsDisplay;
    private StatisticsDisplay statisticsDisplay;
    private ForecastDisplay forecastDisplay;

	public void measurementsChanged() {
    	float temp = getTemperature();
        float humidity = getHumidity();
        float pressure = getPressure();
        
     // 문제 영역    
     currentConditionsDisplay.update(temp, humidity, pressure);
     statisticsDisplay.update(temp, humidity, pressure);
     forecastDisplay.update(temp, humidity, pressure);
    }
}

위 코드에서 WeatherData가 직접 디스플레이를 참조해서 직접 화면을 갱신해준다.

문제는 디스플레이가 추가된다면? 멤버변수도 추가
해야하고 디스플레이를 직접 업데이트 시켜줘야한다.

업데이트 부분을 만약 개발자가 적지않거나 특정 디스플레이는 업데이트 안한다고하면 또 직접 코드를 수정해야 한다. OCP를 위반한다.

위 코드에서 크게 변하지 않을 부분은 데이터를 가져오는 부분이다. 밑에 업데이트하는 부분을 옵저버 패턴으로 변경해야 한다.



profile
모두 화이팅!

0개의 댓글