[Design Pattern] 옵저버 패턴, Observer Pattern

nnnyeong·2021년 5월 30일
1

DesignPattern

목록 보기
3/9

오늘은 옵저버 패턴에 대해 공부해보쟝
옵저버 패턴은 iOS 의 Notification Center 를 떠올리며 쉽게 이해할 수 있었다!
굉장히 적절한 예시로 잘 설명된 글이 있어 해당 글을 참고하여 포스팅을 작성 해 본다

옵저버 패턴이란?

Observer 라는 단어를 통해서 유추할 수 있듯이 어떠한 변화가 발생하는 쪽과 그 변화를 관찰해서 대응하는 쪽, 두가지 간단한 역할로 구성된 패턴이라 할 수 있겠다.

매일같이 이용하는 Youtube 앱을 떠올려보자,
앱을 키고 구독탭에 들어가면 내가 구독하고 있는 계정의 리스트가 화면 위쪽에 보이고 최근에 업데이트 된 순서대로 영상들이 스크롤 뷰를 채우고 있고 알림을 켜 두면 새로운 영상이 올라왔음이 푸시 알람으로 전해진다!

즉, 새로운 영상이 올라오면 (= 변화가 발생하면) -> 발생한 변화를 구독자에게 알려주는 (= 구독자에게 푸시 알람) 요 간단한 과정이 바로 옵저버 패턴의 개념을 이행하고 있다고 할 수 있겠다!

겨울이, 익준이, 준완이는 슬의생 2 (6/17 첫방송 ㅎㅎ) 를 1년째 목빠져라 기다리는 중인데 슬슬 티저가 올라올 것 같아서 채널 십오야의 새 영상을 기다리는 중이다,
그런데 익준이랑 준완이는 채널 십오야 계정을 구독했지만 겨울이는 알고리즘에 의존하다가 구독을 하지 않아버렸당
채널 십오야 편집팀이 열심이 허버허버 편집해서 영상을 딱! 올리면, 익준이 준완이는 채널에서 보낸 푸시 알람으로 바로 들어가서 확인하고~ 겨울이는 익준이 준완이가 봤냐고 물어보면 그제서야 허버허버 들어가서 영상을 확인해버리는~

슬의생을 기다리는 마음으로 열심히 설명해보기,, ㅎㅎ,,,

암튼 이런것이 옵저버 패턴이라 이거야~~ 그만큼 간단하다는거지~~

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



NotificationCenter

몇일 전에도 사용했던 iOS 의 노티피케이션 센터가 적절한 예시가 될 수 있을 것 같아 함께 적어본다.

나의 경우,
앱의 블루투스 권한이 허용되어 있지 않으면 설정 앱으로 이동할 수 있도록 하고, 설정 앱에서 권한 허용 후 background에 있던 앱을 다시 foreground로 가져올 때 블루투스 권한을 다시 확인하기 위한 상황에 NotificationCenter 를 이용하였다.

먼저 A는 'Notification Center에 혹시 "TestNotification" 이라는 이름으로 일이 일어나면, didRecieveTestNotification 함수를 실행할게~! '라고 등록 한다!

옵저버 등록

 NotificationCenter.default.addObserver(self, selector: #selector(didRecieveTestNotification(_:)), name: NSNotification.Name("TestNotification"), object: nil)

 @objc func didRecieveTestNotification(_ notification: Notification) {
         print("Test Notification")
 }

이후 만약 A 가 의도한 상황이 B에서 발생하면 B는 "TextNotification" 이라는 일이 일어났어! 하고 NotificationCenter 에 이를 알린다!

노티피케이션 발송

NotificationCenter.default.post(name: NSNotification.Name("TestNotification"), object: nil, userInfo: nil)

"TestNotification" 이라는 이름을 가진 발송이 도착하면 NotificationCenter는 사전에 등록되어 있던 'didRecieveTestNotification' 메소드를 실행시켜 프로그래머가 의도한 대응이 일어날 수 있도록 한다!

나 역시 앱이 foreground에 들어올 때 마다 블루투스 권한을 확인하기 위해서 해당 뷰 컨트롤러에서 NotificationCenter 에 옵저버를 등록하고, SceneDelegate 의 메소드 sceneWillEnterForeground(_:) 를 통해 NotificationCenter 에 post 하는 방식으로 옵저버 패턴을 적용해 보았다..!

NotificationCenter 에 대한 보다 자세한 내용은 따로 iOS 포스팅을 통해 다루도록 하겠다!




해당 포스팅은 다음 자료를 참고하여 작성되었습니다!
참고 자료 1
참고 자료 2

profile
주니어 개발자까지 ☄️☄️

0개의 댓글