Open j03y14 opened 5 months ago
public class WeatherData {
public void measurementsChanged() {
float temp = getTemparature();
float humidity = getHumidity();
float pressure = getPressure();
}
currentConditionsDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecastDisplay.update(temp, humidity, pressure);
}
옵저버 패턴이란 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의합니다.
: 객체들이 상호작용할 수는 있지만, 서로를 잘 모르는 관계
주제(subject)는 옵저버가 특정 인터페이스를 구현한다는 사실만을 압니다.
옵저버는 언제든지 추가/제거 할 수 있습니다.
새로운 형식의 옵저버를 추가해도 주제를 변경할 필요가 없습니다.
주제와 옵저버는 독립적으로 재사용 가능합니다.
주제가 옵저버와 달라져도 서로 영향을 끼치지 않습니다.
class WeatherData implements Subject {
private observers;
private temparature;
private humidity;
private pressure;
function registerObserver(o: Observer) {
observers.add(o);
}
function removeObserver(){}
function notifyObserver(){}
function setMeasurements(temparature, humidity, pressure){
this.temparature = temparature
// ...
measurementChanged(); // just for analytics?
}
class CurrentConditionDisplay implements Observer, DisplayElement {
this.weatherData
}
주제가 옵저버로 데이터를 보내는 푸시 방식보다, 옵저버가 주제로 부터 데이터를 당겨오는 풀 방식의 선택은 구현의 차이입니다.
애플리케이션의 변화에 적응하기 쉬운 것은 풀 방식이빈다. 주제가 자신의 데이터에 관한 게터 메소드를 지원하고, notify가 발생할 때 마다 게터 메소드를 호출하빈다.
기상 스테이션 구축 프로젝트
WeatherData 객체를 바탕으로 구축
WeatherData 객체는 다음 세가지 객체를 추적
화면에 표시할 항목
추가 요구사항
옵저버 패턴
신문사 + 구독자 => 옵저버 패턴
subject를 구독해놓고, subject의 데이터가 변경되면 옵저버에게 전달이 된다.
느슨한 결합
서로 상호작용할 수 있지만 서로 잘 모르는 관계를 의미.
subject에 getter를 만들어서 옵저버에서 호출하게 하면 안되나? 필요할 때마다 여러번 호출을 해야함. 옵저버 패턴의 단점은 각 옵저버가 필요한 상태만 받는 것이 아니라 전부 받아야 하는 것
대체로는 필요한 데이터만 골라서 가져가도록 하는 방법이 좋다.
옵저버 패턴의 예시
버튼, 이벤트 리스너
그래서 옵저버 패턴을 언제 쓰나?