ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 헤드 퍼스트 디자인 패턴 - 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

    •  
    반응형

    댓글

Designed by Tistory.