포스트

Day44 실습프로젝트(Observer)

Obsever 패턴

옵저버 패턴

옵저버 패턴의 정의

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

옵저버 패턴 만들기

subject interface

  • subject interface는 옵저버를 등록/삭제 및 알리는 메서드선언을 해준다. ```java public interface Subject { public void registerObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObservers(); } ```

observer interface

  • Subject로 부터 업데이트를 하는 메서드를 구현한다. ```java public interface Observer { public void update(Weather weather); } ```
  • Subject구현체에서 사용할 display interface도 만든다. ```java public interface DisplyElement { public void display(); } ```

Subject 구현체

  • Subject interface를 직접적으로 구현하는 구현체 ```java public class WeatherData implements Subject { private List 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(); } } ``` </ul> </div>

    observer구현체

    • Observer 구현체를 만든다. ```java 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(); } } ```

    실행

    • 실행한다. ```java 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)); } } ```
    </div> </div>
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.