-
헤드 퍼스트 디자인 패턴 - 2장 객체들에게 연락 돌리기 - 옵저버 패턴도서 2023. 7. 18. 23:15
가상 모니터링 애플리케이션으로 알아보기
- 기상 스테이션(기상 정보 수집 물리 장비)
- WeatherData 객체
- 디스플레이 장비
3가지 요소로 구성
기상 스테이션과 WeatherData 객체는 제공받는 상황에서 객체와 디스플레이 통합, 디스플레이 표시를 어떻게 구현해야할까?
WeatherData 클래스
가상 모니터링 애플리케이션으로 알아보기
- 기상 스테이션(기상 정보 수집 물리 장비)
- WeatherData 객체
- 디스플레이 장비
3가지 요소로 구성
기상 스테이션과 WeatherData 객체는 제공받는 상황에서 객체와 디스플레이 통합, 디스플레이 표시를 어떻게 구현해야할까?
WeatherData 클래스
- 온도, 습도, 기압 값을 리턴하는 메소드를 가짐
- 이런 기상 관측 값이 생신될 때마다 measurementsChanged 메소드 호출
구현 목표
- 3가지 측정값이 갱신되면 디스플레이 갱신
- 디스플레이는 3가지
- 현재 조건
- 기상 통계
- 기상 예보
- 확장성을 고려하여 구현
첫 구현
class WeatherData { fun measurementsChanged() { val temperature = getTemperature() val humidity = getHumidity() val pressure = getPressure() currentConditionsDisplay.update(temperature, humidity, pressure) statisticsDisplay.update(temperature, humidity, pressure) forecastDisplay.update(temperature, humidity, pressure) } }
measurementsChanged 메소드를 구현하여 측정값을 갱신하면 디스플레이들이 갱신되게 구현했다
문제점
- 구현에 맞추었기 때문에 코드를 고치지 않으면 다른 디스플레이 항목을 추가, 제거할 수 없음
- 확장성이 없음, 실행 중 디스플레이를 더하거나 뺄 수 없다
옵저버 패턴
무언가를 구독한다고 할 때
구독할 것을 제공하는 쪽과 구독자가 바로 옵저버 패턴이 된다
주제(subject) 와 구독자(observer)
구독이 되어있는 A,B,C 객체들은 2라는 값을 받았지만
구독이 되지 않은 D 객체는 받지 못했다
정의
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에 연락이 가고 자동으로 내용이 갱신되는 일대다 의존성
다양한 방법으로 구현할 수 있지만 주로 주제 인터페이스와 옵저버 인터페이스가 들어있는 클래스 디자인으로 구현
구조
- Subject 인터페이스
- 옵저버로 등록, 탈퇴하고 싶을 때 이 인터페이스의 메소드를 사용
- 주제별로 여러개의 옵저버가 있을 수 있음
- Observer 인터페이스
- 옵저버가 되기 원하는 객체는 반드시 구현해야 함
- 주제의 상태가 바뀌면 호출되는 update 메소드
느슨한 결합 (Loose Coupling)
- 객체간 상호작용 가능
- 서로의 구현은 모름
옵저버 패턴에서의 느슨한 결합
- 주제는 옵저버가 특정한 인터페이스 (Observer 인터페이스)를 구현한 사실만을 안다
- 옵저버는 언제든 새로 추가할 수 있다, 제거도 언제든 가능
- 주제는 Observer 인터페이스를 구현하는 객체의 목록에만 의존하기 때문
- 새로운 형식의 옵저버를 추가해도 주제를 변경할 필요가 없다
- 옵저버가 되는 새로운 구상 클래스가 생겼다고 해도 Observer 인터페이스만 구현하고 등록하면 된다
- 주제는 신경쓸 필요가 없다
- 주제와 옵저버는 독립적으로 재사용이 가능하다
- 서로 단단하게 결합되어 있지 않아 다른 용도로 활용할 수 있다
- 주제와 옵저버가 달라져도 서로에게 영향을 미치지 않는다
- 느슨한 결합이므로 인터페이스를 구현한다는 조건만 만족하면 어떻게 고쳐도 문제가 되지 않는다
출처
도서 - 헤드 퍼스트 디자인 패턴
코드
https://github.com/sinna94/head-first-design-patterns
반응형'도서' 카테고리의 다른 글
헤드 퍼스트 디자인 패턴 - 3장 객체 꾸미기 - 데코레이터 패턴 (0) 2023.07.27 헤드 퍼스트 디자인 패턴 - 1장 디자인 패턴의 세계로 떠나기 (0) 2023.07.16