옵저버 패턴 (Observer Pattern)

2023. 7. 2. 23:03디자인패턴

 

 

Observer : [명사] 관찰자

 

보통 게임에서 많이 쓰는 용어이기도 하다.

가장 즐겨하는 게임이자 즐겨보는 게임인 오버워치에서도 이 용어를 활용하고 있다.

 

'옵저버 쩐다', '옵저빙 쩐다' 라는 이야기를 많이 하는데

이는 10명의 선수들이 한 경기에 참가할 때,

옵저버라고 부르는 게임 관찰자(?)가

결정적인 시점(일명 한타)에

결정적인 궁극기나 킬을 사용하는 선수들을

잘 잡아주거나 그 상황을 화면에 잘 잡아줄 때 사용한다.

 

옵저버가 만든 명장면들

 

 


그렇다면 옵저버 패턴이란 무엇일까?

 

 

객체의 상태 변화가 있을 때마다

객체가 직접 이 변화를 옵저버(관찰자)에게 알려주는 

디자인 패턴이다.

 

발행/구독 모델로 알려져 있기도 하다.

 

 

 

 

 

 

 

 

발행/구독과 관련된 예시가 뭐가있을까.. 하고 생각해보니

가장 발행/구독이 활발한 유투브구독자의 관계로 예를 들어보도록하겠다.

 

유투브 (Subject)

구독자 (Observer: Subject에 대한 변화를 관찰하고있다) 

 

 

유투브의 기능

- observerCollection을 통해 구독자를 관리한다.

- registerObserver 를 통해 자신의 구독자를 등록한다.

- unregisterObserver 를 통해 자신의 구독자를 해지한다.

- notifyObserver 를 통해 구독자들에게 영상을 올리면 알려야한다. 

 

 

Subject (유투브)

 

유투브를 상속받은 유투브채널들

 

구독자의 기능

- notify를 통해 유투브의 변화를 감지한다.

Observer와 그를 상속받은 구독자

 

 

 

 

 

1. 공부 / 스포츠 채널을 생성

 

2. 공부 채널 : 류진, 카리나

    스포츠 채널: 류진, 미연을 셋팅

 

3. 첫번째 공부 V-log와 직관후기 영상이 각각 올라가면

각각의  구독자들에게 알림을 보내고 구독자들은 알림을 받음

 

4. 공부 채널에서 카리나 삭제

 

5. 두번째 공부 V-log 영상 업로드 시, 류진만 알림을 받음.

 

 


장점 :

- Subject(Youtube)의 코드를 수정하지 않고

새로운 Observer(Subscriber) 클래스를 추가할 수 있습니다.

 

- 느슨한 결합이 가능해져

시스템이 유연해지고 객체간 의존성을 제거할 수 있습니다.

 

 

단점 : 

- 복잡도가 증가할 수 있습니다.

 

- Subject가 Observer의 메서드를 직접 호출하여

모든 Observer가 메서드를 반환하기 전까지 다음 작업을 진행할 수 없습니다.

   =) 멀티스레드 시스템에서 특정 ObserverSubject의 락을 물고 있다면

시스템이 교착상태에 빠질 수 있다.

 

 

 


강한 결합 예시 

https://brownbears.tistory.com/555