[디자인 패턴] 옵저버 패턴(Observer Pattern)

조민서·2023년 9월 5일
2

디자인 패턴

목록 보기
2/2

정의

옵저버 패턴(Observer Pattern) 은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(ont-to-many) 의존성을 정의한다.

주제(subject) + 구독자(observer) = 옵저버 패턴
구독자는 주제를 구독하고, 각 주제들은 각 주제의 구독자들에게 해당 주제를 준다.

ex) 시청자가 유튜버를 구독하면, 유튜브가 올린 미디어가 구독자(시청자)에게 보여진다.

❗️ 주의
출판-구독(Publish-Subsribe) 패턴 이랑 다른 패턴이다.
출판-구독 패턴은 출판사와 구독자를 더 세세하게 분리할 수 있는 복잡한 패턴이다. 미들웨이 시스템에서 종종 쓰인다.


의도

옵저버 패턴은 여러 객체에 자신이 관찰 중인 객체에 발생하는 모든 이벤트에 대하여 알리는 구독 메커니즘을 정의할 수 있도록 한다.

상호 작용하는 객체 사이에는 가능하면 느슨한 결합을 사용한다.
느슨한 결합(Losse Coupling): 객체들이 상호작용할 수는 있지만, 서로를 잘 모르는 관계를 의미한다.

상호 작용하는 객체 사이 단어의 의미
주제 X와 주제 Y
주제X와 옵저버A
옵저버A와 옵저버B 등등


적용

예시
하드웨어를 통해 온도, 기압, 습도 등 기후 정보를 가져와서 디스플레이에 보여주고 싶다.
하지만 각각의 디스플레이는 보여주고 싶은 화면이 다르다.

  • 1번 디스플레이: 온도, 습도, 기압
  • 2번 디스플레이: 평균 기온, 최저 기온, 최대 기온
  • 3번 디스플레이: 온도에 따른 날씨 이미지 - ex) 영하 3도면 눈 내리는 이미지
  • 4번 디스플레이: 클라이언트가 직접 매번 다르게 디스플레이 요소를 더하거 뺴고 싶은 상황 > 이런 상황을 미리 대처하기 위해 유연한 확장성이 필요함

1. 각각의 디스플레이는 원하는 요소가 다르다. `DisplayElement.interface` 를 만들고, 각각의 디스플레이는 이 인터페이스를 구현한다.
  1. 그리고 각 디스플레이들은 인터페이스에 따라 distpaly.class 를 자기 입맛대로 구현한다.
  1. 디스플레이가 화면을 보여주기 전에 기후 정보를 가져와야 한다. 즉 하드웨어 에서 기후 정보가 업데이트 될 때 마다 모든 디스플레이에게 기후 정보가 변했음을 알려줘야 한다.
  1. Observer.interface를 만든다. 이 인터페이스는 update.class 메서드를 가지고 있고, update()를 하는 순간 모든 디스플레이에게 업데이트를 알린다. 즉 하드웨어에서 기후 정보를 보내주면 update()를 실행하고, 변경 된 정보들을 구독자(디스플레이들)들에게 알려준다.

주제(신문사): 하드웨어 센서
구독자: 디스플레이들

각각의 디스플레이들은 하드웨어 센서를 구독(Observer)하고 Observer.interface, 자신이 원하는 화면을 보여줄 DisplayElement.interface구성(Composition)한다.


효과

  • 주제는 옵저버가 특정 인터페이스를 구현한다는 사실만 안다.

  • 옵저버는 언제든지 새로 추가할 수 있다.

  • 주제와 옵저버는 서로 독립적으로 재사용할 수 있다.

  • 주제나 옵저버가 달라져도 서로에게 영향을 미치지 않는다.

  • 새로운 형식의 옵저버를 추가할 때도 주제를 변경할 필요가 전혀 없다.


결과

옵저버 패턴 을 이용하면 새로운 주제 또는 옵저버 즉 새로운 클래스가 추가 되도 코드가 서로 의존되지 않고 독립적으로 확장할 수 있다. > 행동 패턴, 개방폐쇄 원칙

객체지향 원칙

  1. 바뀌는 부분은 캡슐화 한다.
  2. 상속 보다는 구성(Composition)을 활용한다.
  3. 구현보다는 인터페이스에 맞춰서 프로그래밍한다.
  4. 상호작용하는 객체 사이에서는 가능하면 느슨한 결합을 사용해야 한다.

관련 내용

  • 자바에서 제공했던 Observer.interface, Observable.class는 자바 9 이후로 쓰이지 않는다.
  • 대신 자바빈은 Bean에서 PropertyChangeEvents로 유형 속성이 바뀌었을 때 PropertyChangeListener에 알림을 보내 주는 기능을 제공한다.
    또한 비동기 스트림을 처리하는 Flow API와 관련된 출판-구독 구성 요소도 제공한다.
    Flow API, 출판-구독 구성 요소
  • 옵저버를 알림 순서에 의존시키지 말자.
profile
블로그 이사 이사했습니돠: https://virtualworld.tistory.com/

1개의 댓글

comment-user-thumbnail
2023년 9월 10일

선생님 네이버 메일로 질문을 보내드렸는데 실례가 되지않는다면 확인한번만 부탁드려도될까요 ?

답글 달기