Tech Log

[Design Pattern] Observer Pattern 본문

Design Pattern

[Design Pattern] Observer Pattern

yuhee kim 2023. 3. 31. 08:00

1. Observer Pattern이란?

주체가 어떤 객체(subject)의 상태 변화를 관찰하다가,

상태 변화가 있을 때마다 메소드 등을 통해 옵저버들에게 변화를 알려주는 디자인 패턴.

 

출처 : 면접을 위한 CS 전공지식 노트(2022)

주체는 객체의 상태 변화를 보고 있는 관찰자를 말한다.
옵저버들은 객체의 상태 변화에 따라 전달되는 메소드, 이벤트 등을 기반으로 추가 변화 사항이 생기는 객체들이다.

 

출처 : 면접을 위한 CS 전공지식 노트(2022)

위와 같이 주체와 객체를 분리하지 않고 상태가 변경되는 객체만을 기반으로 옵저버 패턴을 적용하기도 한다.

 

출처 : 면접을 위한 CS 전공지식 노트(2022)

옵저버 패턴의 원리가 적용된 서비스 중에는 트위터가 있다.

팔로워들은 주체가 새로운 트윗을 올리면 알림을 받게 된다.

 

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
Comments