에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다
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 + "%");
}
}
'Java > Design Pattern' 카테고리의 다른 글
[헤드퍼스트 디자인 패턴] 5. 싱글턴 패턴 (1) | 2024.12.16 |
---|---|
[헤드퍼스트 디자인 패턴] 4. 팩토리 패턴 (0) | 2024.12.16 |
[헤드퍼스트 디자인 패턴] 3. 데코레이터 패턴 (1) | 2024.12.16 |
[헤드퍼스트 디자인 패턴] 0. 디자인 패턴이란 (1) | 2024.12.16 |
[헤드퍼스트 디자인 패턴] 1. 전략 패턴 (2) | 2024.12.16 |