한 객체의 상태가 바뀌면, 그 객체에 의존하는 모든 객체들에 연락이 가고 자동으로 내용이 갱신되는 방식
주제에서 중요한 데이터 관리 → 주제 데이터 바뀌면 옵저버에게 바뀐 값 / 바뀌었다는 소식이 전해진다.
옵저버 객체들은 주제를 구독하고 있으며(주제 객체에 등록되어 있음), 주제 데이터가 바뀌면 갱신 내용을 전달받는다.
Subject : Observer = 1 : N 관계
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers(); // 모든 옵저버들에게 변경내용을 알리려 호출하는 메소드
}
public interface Observer {
public void update(float temp, float humidity, float pressure);
} // 기상 정보가 변경되었을 때 옵저버에게 전달되는 상태값들
여기까지는 Subject가 Observer들에게 Push 하는 방식
반대로 Observer들이 Pull 해오는 방식도 있다.
// Subject : 알림 보내기
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
} // update 메소드 인자 없이 호출하도록
}
// Observer : 알림 받기
public interface Observer {
public void update();
}
// CurrentConditionsDisplay 클래스라면 업데이트를 아래처럼 구현하면 된다.
public void update() {
this.temperature = weatherData.getTemperature();
this.humidity = weather.getHumidity();
display();
} // 원하는 데이터만 (온도, 습도) 받아올 수 있다!
🍄 활용 방안
애플리케이션에서 달라지는 부분을 찾아내고 달라지는 않는 부분과 분리
옵저버 패턴에서 변하는 것은 주제의 상태와 옵저버의 개수, 형식
옵저버 패턴에서는 주제를 바꾸지 않고도 주제의 상태에 의존하는 객체를 바꿀 수 있음
나중에 바뀔것을 대비해두면 편하게 작업할 수 있다
구현보다 인터페이스에 맞춰서 프로그래밍하자
주제는 Subject interfcae, 옵저버는 Observer interface
Observer 인터페이스를 구현하는 객체들의 등록과 탈퇴를 관리하고, 그런 객체들에 연락 돌림