본문 바로가기
개발자 꿈나무의 하루/01_Boot Camp

(네이버클라우드 부트캠프) 44일차 - 실습프로젝트(Observer패턴)

by kk_naks 2024. 7. 30.

Obsever 패턴

옵저버 패턴

옵저버 패턴의 정의

    • 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식
    • 일대다 의존성(one to many)을 기반으로 주제객체의 상태를 옵저버 객체에게 알린다.
image

옵저버 패턴 만들기

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