2023. 7. 2. 23:03ㆍ디자인패턴
Observer : [명사] 관찰자
보통 게임에서 많이 쓰는 용어이기도 하다.
가장 즐겨하는 게임이자 즐겨보는 게임인 오버워치에서도 이 용어를 활용하고 있다.
'옵저버 쩐다', '옵저빙 쩐다' 라는 이야기를 많이 하는데
이는 10명의 선수들이 한 경기에 참가할 때,
옵저버라고 부르는 게임 관찰자(?)가
결정적인 시점(일명 한타)에
결정적인 궁극기나 킬을 사용하는 선수들을
잘 잡아주거나 그 상황을 화면에 잘 잡아줄 때 사용한다.
그렇다면 옵저버 패턴이란 무엇일까?
객체의 상태 변화가 있을 때마다
객체가 직접 이 변화를 옵저버(관찰자)에게 알려주는
디자인 패턴이다.
발행/구독 모델로 알려져 있기도 하다.
발행/구독과 관련된 예시가 뭐가있을까.. 하고 생각해보니
가장 발행/구독이 활발한 유투브와 구독자의 관계로 예를 들어보도록하겠다.
유투브 (Subject)
구독자 (Observer: Subject에 대한 변화를 관찰하고있다)
유투브의 기능
- observerCollection을 통해 구독자를 관리한다.
- registerObserver 를 통해 자신의 구독자를 등록한다.
- unregisterObserver 를 통해 자신의 구독자를 해지한다.
- notifyObserver 를 통해 구독자들에게 영상을 올리면 알려야한다.
구독자의 기능
- notify를 통해 유투브의 변화를 감지한다.
1. 공부 / 스포츠 채널을 생성
2. 공부 채널 : 류진, 카리나
스포츠 채널: 류진, 미연을 셋팅
3. 첫번째 공부 V-log와 직관후기 영상이 각각 올라가면
각각의 구독자들에게 알림을 보내고 구독자들은 알림을 받음
4. 공부 채널에서 카리나 삭제
5. 두번째 공부 V-log 영상 업로드 시, 류진만 알림을 받음.
장점 :
- Subject(Youtube)의 코드를 수정하지 않고
새로운 Observer(Subscriber) 클래스를 추가할 수 있습니다.
- 느슨한 결합이 가능해져
시스템이 유연해지고 객체간 의존성을 제거할 수 있습니다.
단점 :
- 복잡도가 증가할 수 있습니다.
- Subject가 Observer의 메서드를 직접 호출하여
모든 Observer가 메서드를 반환하기 전까지 다음 작업을 진행할 수 없습니다.
=) 멀티스레드 시스템에서 특정 Observer가 Subject의 락을 물고 있다면
시스템이 교착상태에 빠질 수 있다.
강한 결합 예시