옵저버 패턴

Logos·2022년 4월 22일
0

Design Patterns

목록 보기
2/2

옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다.
위키 Observer Pattern

옵저버 패턴이란?

: 하나의 객체 A가 있고 이 객체의 상태에 대한 관심을 가진 다른 객체들B, C, D 등 이 존재한다. 여기서 B, C, D 등을 "관찰자/Observer"라고 한다. 만약, A의 상태가 변화한다면, 이러한 상태변화들을 관찰자들 B, C, D 등에게 알려주게 하는 방식이 바로 옵저버 디자인 패턴이다.

구현 구조

아래의 두 가지를 기억하자.
(1) "Subject" interface
(2) "Observer" interface

(1) Subject란?

: 간단히 "주제" 또는 "논의 대상" 이란 뜻을 가지고 있는 것으로, 관찰자들이 관찰하는 "관찰 대상" 또는 "요주의 대상"으로 이해해도 될 것이다.

(2) Observer란?

: 간단히 "관찰자" 로 Subject의 상태 변화에 대한 알림을 받는 대상이라고 보면 된다.

잠깐! 왜 둘다 interface로 하였는가?

: 둘 중 하나는 abstract도 아니고 interface로 설정하였다. 그 이유는 무엇일까?

1. stackoverflow에서 이야기하는 interface와 abstract class에 대한 간결 정리 참조
2. Stackoverflow가 참조한 원문

위의 참조 글을 보면, abstract는 객체에 자체에 대한 정의를 하기 위한 기반으로 사용하고, interface는 객체가 "하는 일"에 대한 정의를 위해 사용한다.

즉, Subject와 Oserver들은 객체의 상태를 정의하기 위한 것보다는 각자의 하는 일/역활이 정해진 것임을 유추할 수 있다.

관찰 대상/Subject가 해야할 일은?

1) 알릴 의무
: 관찰 대상은 자신의 상태가 변하였다는 것을 "알릴 의무"를 가진다.
2) 관찰자를 관리할 의무
(1) 관찰자 등록 / (2) 관찰자 제외

  • 예를 들어, news 에서 "새로운 소식" 등의 "데이터" 가 "관찰 대상" 이라면, news는 구독하는 구독자들을 관리하고 또 구독자들에게 새로운 data 업데이트가 있다는 것을 알려줄 필요가 있다.

관찰자 가 할일?

: 새로운 내용에 대한 Update 를 해준다.

  • 예를 들어, news에서 새로운 소식등 상태 변화 data가 관찰되었다면, news를 구독하는 구독자의 장치에서 news화면을 update해줄 필요가 있다.

디자인 상황

: 위의 내용을 가지고 다음의 상황을 옵저버 패턴으로 구현해보자. 영상 화면이 있는데 실시간으로 대사가 "영어"로 전달이 된다. 그리고 이 대사가 전달될때마다, 서로 다른 언어들 한국어, 중국어, 일본어 등 사용자가 등록한 설정에 따라 번역된 자막이 송출되는 실시간 자막 형성기가 필요하다.

step1 - Subject와 Observer 분리

1) subject = "실시간 대사"
2) observer = "시청자"

step2 - subject interface와 observer interface에 필요한 methods

1) subject - registUsers, removeUsers, sendScripts
2) observer - updateSubtitle

step3 - subject와 observer를 실제 구현하는 VideoSubtitle

profile
Fed. Software Developer

0개의 댓글