728x90
Observer 패턴
- observer 패턴은 GoF의 디자인 패턴 중 하나로 관찰 대상이 되는 객체가 변경되면 대상 객체를 관찰하고 있는 observer에게 변경사항을 통지하는 디자인 패턴을 말한다.
- observer 패턴을 사용하면 객체 간의 상호작용을 쉽게 하고, 효과적으로 데이터를 전달할 수 있다.
구조

- observer 패턴은 관찰 대상인 Subject와 Subject를 관찰하는 Observer로 이루어져 있다.
- 하나의 Subject에는 1개/여러 개의 observer를 등록할 수 있다.
- Subject의 상태가 변경되면, 자신을 관찰하는 Observer들에게 변경사항을 통지한다.
- Subject로 변경사항을 통지 받은 Observer는 부가적인 처리를 한다.
- observer 패턴은 Subject와 Observer를 상속한 구체화된 클래스가 존재하며, 그 클래스는 Subject와 Observer에 대한 상세 구현을 작성한다.
Subject 함수
| 함수 | 설명 |
| add | 서브젝트의 상태를 관찰할 observer 등록한다 |
| remove | 등록된 observer를 삭제한다 |
| notify | 서브젝트 상태가 변경되면 등록된 observer에 통지한다 |
Observer 함수
| 함수 | 설명 |
| update | 서브젝트의 notify 내부에서 호출되며 서브젝트의 변경에 따른 부가 기능을 처리 |
Observer 패턴 구현
class Coffee(val name: String)
//Subject
class Barista : Observable() {
private lateinit var coffeeName: String
fun orderCoffee(name: String) {
this.coffeeName = name
}
fun makeCoffee(){
setChanged()
notifyObservers(Coffee(this.coffeeName))
}
}
//observer
class Customer(val name: String): Observer{
override fun update(o: Observable?, arg: Any?) {
val coffee = arg as Coffee
println("${name}이 ${coffee.name}을 받았습니다")
}
}
fun main() {
val barista = Barista()
barista.orderCoffee("아이스 아메리카노")
val customer = Customer("고객1")
val customer2 = Customer("고객2")
val customer3 = Customer("고객3")
barista.addObserver(customer)
barista.addObserver(customer2)
barista.addObserver(customer3)
barista.makeCoffee()
}
- JDK 1.0부터 포함된 Observable 클래스와, Observer 인터페이스를 사용한 예제이다.
- Custom 클래스는 Observer 인터페이스를 구현하며, Barista 클래스가 커피를 완성하면 통지를 받아 update 함수를 처리한다.
- Barista 클래스는 Observable 클래스를 상속하여 고객이 주문한 커피가 만들어지면, notifiyObservers로 고객에게 만들어진 Coffee 객체를 전달한다.
- setChanged()를 먼저 호출하여 변경 여부를 내부에 저장한다.
- Customer 클래스가 Barista 클래스를 관찰하기 위해 addObserver로 등록한다.
Observer 패턴 장점
- observer 패턴을 사용하지 않았다면 고객은 일정 간격으로 커피가 완성됐는지 바리스타에게 확인하는 처리가 있어야 한다.
- 간격이 너무 짧으면 변경된 상태를 빠르게 확인할 수 있지만, 매번 불필요한 호출이 발생하므로 성능상 문제가 발생할 수 있다.
- 간격이 너무 길면 변경된 상태를 즉시 확인할 수 없으므로 실시간성이 떨어질 수 있다.
- observer 패턴은 관찰자인 observer가 서브젝트의 변화를 신경 쓰지 않고 상태 변경의 주체인 Subject가 변경사항을 observer에게 알려줌으로써 위 문제를 해결할 수 있다.
- observer 패턴은 데이터를 제공하는 쪽에서 데이터를 소비하는 측에 통지하는 Push 방식이다.
Observer 패턴에서 서브젝트와 Observer는 관심사에 따라 역할과 책임이 분리되어 있다
- Subject는 Observer 각 어떤 작업을 하는지 Observer의 상태가 어떤지에 대해 관심을 가질 필요가 없고 오직 변경 사항을 통지하는 역할만 수행하고, 하나/ 다수의 Observer는 각각 맡은 작업을 스스로 하기 때문에 observer가 하는 일이 Subject에 영향을 끼치지 않고 Observer는 단순한 데이터의 소비자로서 존재하게 된다.
728x90
'실무 프로젝트로 배우는 Kotlin & Spring > 리액티브 프로그래밍' 카테고리의 다른 글
| 리액티브 프로그래밍 (0) | 2022.12.01 |
|---|---|
| Iterator 패턴 (0) | 2022.12.01 |
| 비동기-논블로킹 프로그래밍 (0) | 2022.11.28 |