[Design Pattern] Observer

[디자인 패턴][행위 패턴] 옵저버

Posted by ChaelinJ on May 13, 2021

Observer

객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 패턴

  • 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 1:N 객체 의존 관계를 구성하는 패턴
  • 한 객체의 상태 변화에 의해 자동으로 갱신될 수 있게 하는 패턴

위와 같은 구조로 소통합니다.

  • Observer 객체들을 Subject에 등록, 삭제할 수 있습니다.
  • Subject 객체에서 변경이 발생하면 등록된 Observer 객체들에 알리며 부가적인 활동을 할 수 있습니다.

Subject 객체와, Observer 객체와의 1:N 관계가 성립됩니다.

다이어그램

  • Subject: 주체가 되는 클래스
    • Observer 객체들을 관리
  • Observer: 데이터의 변경을 통보 받는 인터페이스

특징 - 느슨한 결합

Subject 객체에선 구체적인 ConcreteObserver 객체에 대해 알 수 없고, 어떤 동작을 수행하는지 모릅니다.

다만 ConcreteObserver 객체들은 Observer 인터페이스를 구현한다는 것만 알 수 있습니댜.

또 Observer는 언제든 추가되거나 제거될 수 있으며, 이는 Subject 객체에 전혀 영향을 주지 않습니다.

Observer와 Subject 객체는 결합도가 낮아 각각 재사용 할 수 있습니다.

예시

간단하게 유튜브 채널과 구독자로 예를 만들어 보았습니다.

  • Concrete Subject: Channel
  • Concrete Observer: Subsriber

채널에 구독하면 채널에서 알람을 보낼 때 받을 수 있습니다.

실제 유튜브 구독 로직과는 관계 없습니다…! 예시에요.

Subject

Observer

Main

출력

To min [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To lin [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To kim [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To qasd [[HiTV] 즐거운 카페 브이로그 영상이 업로드 되었습니다.]
To min [[HiTV] 채널 폐쇄 안내]
To lin [[HiTV] 채널 폐쇄 안내]
To kim [[HiTV] 채널 폐쇄 안내]

등록과 제거가 다 잘 되었습니다.

Observer와 Subject 간의 결합을 느슨하게 하며 복잡한 객체 관계에서 1:N 관계의 수정이 필요할 때 유용한 Observer 패턴에 대해 알아보았습니다!

옵저버 패턴과 중재자 패턴의 차이?

두 패턴의 다이어그램을 보면 굉장히 비슷합니다.

중재자 패턴

옵저버 패턴

두 패턴의 차이는 Publisher - Subscriber 간의 관계 차이입니다.

옵저버 패턴은 하나의 Publisher에 대한 N개의 Subscriber가 존재합니다.

중재자 패턴은 N개의 Publisher에 M개의 Subscriber가 존재하며, 양 방향으로 상태를 관찰하기 때문에 Publisher와 Subscriber 간의 구분이 없이 Publisher가 되었다가 Subscriber가 될 수도 있습니다.


참조

감사합니다.

Text by Chaelin. Photographs by Chaelin, Unsplash.