Obsever 패턴
옵저버 패턴
옵저버 패턴의 정의
- 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식
- 일대다 의존성(one to many)을 기반으로 주제객체의 상태를 옵저버 객체에게 알린다.
옵저버 패턴 만들기
subject interface
- subject interface는 옵저버를 등록/삭제 및 알리는 메서드선언을 해준다.
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
observer interface
- Subject로 부터 업데이트를 하는 메서드를 구현한다.
public interface Observer {
public void update(Weather weather);
}
- Subject구현체에서 사용할 display interface도 만든다.
public interface DisplyElement {
public void display();
}
Subject 구현체
- Subject interface를 직접적으로 구현하는 구현체
public class WeatherData implements Subject {
private List<Observer> obsevers;
private Weather weather;
public WeatherData(Weather weather) {
this.obsevers = new ArrayList<>();
this.weather = new Weather();
}
@Override
public void registerObserver(Observer observer) {
obsevers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
obsevers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : obsevers) {
observer.update(weather);
}
}
public void measurementsChanged() {
notifyObservers();
}
public void setMeasurements(Weather weather) {
this.weather = weather;
measurementsChanged();
}
}
observer구현체
- Observer 구현체를 만든다.
public class CurrentConditionsDisplay implements Observer, DisplyElement {
private Weather weather;
private WeatherData weatherData;
public CurrentConditionsDisplay(WeatherData weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
@Override
public void display() {
System.out.printf("현재 온도 : %f , 현재 습도 : %f", weather.getTemp(), weather.getHumidity());
}
@Override
public void update(Weather weather) {
this.weather = weather;
display();
}
}
실행
- 실행한다.
public class App {
public static void main(String[] args) {
Weather weather = new Weather();
WeatherData weatherData = new WeatherData(weather);
CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(new Weather(36, 50, 50));
}
}
실습 프로젝트 적용하기
https://github.com/kknaks/bitcamp-mystudy/tree/main/class/Day44_source/app
https://github.com/kknaks/bitcamp-mystudy/tree/main/class/Day44_source/app
'개발자 꿈나무의 하루 > 01_Boot Camp' 카테고리의 다른 글
(네이버클라우드 부트캠프) 46일차 - Java프로그래밍 기초(네트워크) (0) | 2024.08.01 |
---|---|
(네이버클라우드 부트캠프) 45일차 - 실습프로젝트(네트워킹) (0) | 2024.07.30 |
(네이버클라우드 부트캠프) 41일차 - Java프로그래밍 기초(파일 입출력) (0) | 2024.07.24 |
(네이버클라우드 부트캠프) 40일차 - 실습프로젝트(Gson, Generic) (4) | 2024.07.23 |
(네이버클라우드 부트캠프) 39일차 - 실습프로젝트(파일입출력2) (0) | 2024.07.22 |