Observer Pattern
- LiveData를 공부하기 전에 옵져버 패턴에 대한 이해가 선행되어야 한다.
- LiveData공식문서를 보면, "LiveData는 관찰자 패턴을 따릅니다. LiveData는 기본 데이터가 변경될 때 Observer 객체에 알립니다."라고 되어있기 때문이다.
- 옵져버 패턴은 디자인 패턴 중 하나로, 감시자들이 한곳을 계속 바라보고 있는 패턴이다. 어떤 이벤트가 일어나면 이벤트를 관찰하던 관찰자들이 바로 반응하는 패턴이다.
- 이런 옵져버 패턴을 가지지 않는다면 이벤트를 체크해야하는 오브젝트들은 이런 이벤트가 발생했는지 계에속 이벤트를 발생 여부를 확인해야 한다.
- → 필요없는 리소스 낭비가 발생하고 이벤트 발생 감지를 놓치는 경우 발생
- → 하지만 옵져버가 반응하니 바로 이벤트를 감지할 수 있다.
- 이런 방법을 polling이라고 한다.
- 3개의 중요한 구성요소가 있다.
- 이벤트를 감지할 Observer 인터페이스 : 관찰자 역할을 하는 인터페이스는 메서드로 어떤 이벤트가 동작하는 함수인 update()를 가지고 있습니다.
- Observer 인터페이스를 구현하는 실제 Observer class : update() 메서드를 가지기 때문에 이벤트가 일어났을 때 각 class별로 특정 동작을 정의할 수 있다.
- Observer 인터페이스 구현체를 리스트로 가지고 있는 Class : 옵져버 인스턴스를 리스트에 추가해주기 위한 register(), 이벤트가 일어났을 때 소유하고 있는 옵져버들에게 update를 알리는 notifyUpdate()함수를 가지고 있다.
LiveData 실습
1. 먼저 observer 인터페이스 정의
관찰자(감시자) 역할을 하는 observer인터페이스는 내부 함수로 이벤트가 일어났을 때 동작할 update() 메서드를 가지고 있다.
interface Observer {
fun update()
}
2.Observer를 상속받은 dog, cat는 각각 update()함수에서 야옹, 멍멍을 정의한다.
class Dog: Observer{
override fun update(){
println("멍멍")
}
}
class Cat: Observer {
override fun update() {
println("야옹")
}
}
3. 동물의 주인인 Owner는 내부에 ObserverList를 가지고 있고 ObserverList에 Observer를 추가하는 register()를 가지고 있다. 또한 가지고 있는 Observer들에게 update() 를 알리기 위한 notifyUpdate() 함수를 정의하고 있다.
class Owner {
val observerList = mutableListOf<Observer>()
fun register(observer:Observer){
observerList.add(observer)
}
fun notifyUpdate(){
for(observe in observerList){
observe.update()
}
}
}
4. 이제 Owner, Dog, Cat 인스턴스들을 하나씩 만들고 Owner에게 register()로 Dog,Cat 관찰자를 등록한다.
fun main(){
val owner=Owner()
val dog=Dog()
val cat=Cat()
owner.register(dog) //옵져버 등록
owner.register(cat) //옵져버 등록
owner.notifyUpdate() //오너가 신호를 보냄 = 이벤트 발생
}
- UI Controller인 Activity, Fragment는 Owner의 이벤트(ex)클릭 이벤트)를 받는다
ref
'Kotlin > TIL' 카테고리의 다른 글
Android -GoogleMap 사용 (TIL 05.01) (0) | 2024.05.01 |
---|---|
SharedPreference (TIL 04.30) (0) | 2024.04.30 |
TIL (04.23) (0) | 2024.04.23 |
TIL (04.22) (0) | 2024.04.22 |
TIL(04.18) (1) | 2024.04.18 |