SELF STUDY/Design Pattern

[디자인 패턴] Observer pattern | 옵저버 패턴

호이호이호잇 2021. 8. 18. 17:00
728x90
반응형

오늘의 함께 공부할 패턴은 옵저버 패턴 입니다.

 

"옵저버" 라는 말을 들어본 적이 있나요?

 

저는 안드로이드 개발 하면서 database 값을 많이 사용하는데, 이때 이 값의 변화를 실시간으로 알고자 할때 "ContentObserver"를 사용했었습니다.

사실.. ContentObserver의 소스를 본 적은 없기에, 명확하게 동작을 알지 못하고 사용하고 있었습니다.

이번 스터디가 ContentObserver의 소스를 살펴보게 해주었습니다.

 

 

일단 옵저버 패턴!

우리 주변에서 사용법을 찾아보면 어떤 것들이 있을까요?

 

일단 저는 유튜브 구독 시스템으로 설명을 해보려 합니다.

위 사진에서 빨간 사각형 안에 있는 핸드폰들이 유튜브 한 채널을 구독하고 있는 5명의 구독자들 입니다.

만약 구독자들이 "구독"을 하고 있으면. 채널에 새로운 영상이 올라왔을때 "알림"을 받게 됩니다.

 

이것이 옵저버 패턴의 큰 개념 이라고 생각하면 될 것 같습니다.

 

여기서 상태의 변화를 알려주는 객체인 "유튜브 채널"subject 이고,

"유튜브 채널" 의 상태 변화를 실시간으로 받는 "구독자"들이 object 입니다.

 

따라서 옵저버 패턴을 정리해보면 한 객체(Subject)의 상태가 바뀌면, 그 객체에 의존하는 다른 객체(Object)들에게 연락이 가고 자동으로 갱신되는 1:N의 관계를 갖는 패턴입니다.

 

안드로이드에서 예를 찾아본다면, "비행기모드" 를 생각할 수 있을 것 같습니다.

 

전체적인 시나리오는 아래 사진과 같습니다.

안드로이드에서 비행기 모드를 설정하면, 설정한 값이 데이터베이스 "AIRPLANE_MODE_ON"에 True/False로 저장이 되게 됩니다.

이 값이 Subject이고 이 값이 변하게 되면, Object인 Wi-Fi, Bluetooth, Call 등이 영향을 받아 설정하게 됩니다.

아래 소스 예제 참고하면 이해하는데 도움이 될 것 같습니다.

 

- packages/apps/Settings/src/com/android/settings/AirplaneModeEnabler.java

비행기 모드 설정하면, 데이터베이스 "AIRPLANE_MODE_ON"를 1(On), 0(Off)로 설정해줍니다.

 

위 세팅 앱 설정에 따라 위 상단의 GlobalActionsDialog에서 실시간 변화가 일어나게 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(실제 화면 사진)

- frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java

 

블루투스 또한  "AIRPLANE_MODE_ON" 값에 Observer를 등록하고, 변화에 따른 설정을 해줍니다.

- frameworks/base/services/core/java/com/android/server/BluetoothManagerService.java

 

 

추가로 안드로이드에 이미 구현되어 있는 Observer 소스를 통해 옵저버 패턴을 확인 할 수 있습니다.

- frameworks/base/services/core/java/com/android/server/content/ContentService.java

 

728x90
반응형