Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- MVVM
- CS지식
- 개발
- 안드로이드 개발
- 데이터베이스
- 운영체제
- 코틀린
- reactnative
- OS
- 스레드
- db
- 리액트
- 프로세스
- 리액트네이티브
- 디자인 패턴
- 앱 개발
- 디자인패턴
- React
- Android
- 안드로이드 디자인 패턴
- 앱
- Kotlin
- 액티비티
- Operating System
- 메모리
- 안드로이드
- 앱개발
- github
- Database
- cs
Archives
- Today
- Total
Tech Log
[Design Pattern] Observer Pattern 본문
1. Observer Pattern이란?
주체가 어떤 객체(subject)의 상태 변화를 관찰하다가,
상태 변화가 있을 때마다 메소드 등을 통해 옵저버들에게 변화를 알려주는 디자인 패턴.
주체는 객체의 상태 변화를 보고 있는 관찰자를 말한다.
옵저버들은 객체의 상태 변화에 따라 전달되는 메소드, 이벤트 등을 기반으로 추가 변화 사항이 생기는 객체들이다.
위와 같이 주체와 객체를 분리하지 않고 상태가 변경되는 객체만을 기반으로 옵저버 패턴을 적용하기도 한다.
옵저버 패턴의 원리가 적용된 서비스 중에는 트위터가 있다.
팔로워들은 주체가 새로운 트윗을 올리면 알림을 받게 된다.
2. 예시
kotlin으로 작성한 옵저버 패턴 예시는 다음과 같다.
interface Observer {
fun update()
}
interface Observable {
val observers: ArrayList<Observer>
fun add(observer: Observer) {
observers.add(observer)
}
fun remove(observer: Observer) {
observers.remove(observer)
}
fun sendUpdateEvent() {
observers.forEach { it.update() }
}
}
class Note : Observable {
override val observers: ArrayList<Observer> = ArrayList()
var memo = ""
set(value) {
field = value
sendUpdateEvent()
}
}
Observer 인터페이스의 update 메소드는 Observer 객체가 변경될 때마다 호출된다.
Observable의 sendUpdateEvent 메소드는 모든 옵저버들에게 객체가 변경되었다고 알리는 역할을 한다.
fun main() {
val note = Note()
note.memo = "abcd"
}
위와 같이 Note 객체의 memo의 값이 변경되면,
sendUpdateEvent 메소드가 호출될 것이며
Note 객체의 옵저버들은 변경이 되었다는 알림을 받게 될 것이다.
3. 안드로이드에서의 Observer Pattern
- Coroutine Flow의 collect
- LiveData Observer
참조
- 주홍철, 면접을 위한 CS 전공지식 노트, 길벗(2022)
- Baeldung
'Design Pattern' 카테고리의 다른 글
[Design Pattern] Repository Pattern (0) | 2023.03.30 |
---|---|
[Design Pattern] 의존성 주입(Dependency Injection) (0) | 2023.03.29 |
[Architecture Pattern] MVP 패턴 (0) | 2022.09.04 |
[Architecture Pattern] MVVM 패턴 (0) | 2022.08.30 |
[Architecture Pattern] MVC 패턴 (2) | 2022.08.30 |
Comments