Day44 실습프로젝트(Observer)
Obsever 패턴
옵저버 패턴
옵저버 패턴의 정의
옵저버 패턴 만들기
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(); } } ```
실행
</div> </div>- 실행한다. ```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)); } } ```
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.