이 문서는 Google Cloud Translation API를 사용해 자동 번역되었습니다.
어떤 문서는 원문을 읽는게 나을 수도 있습니다.
관찰자 패턴은 주제라고 하는 개체가 관찰자라고 하는 종속 항목 목록을 유지 관리하고 일반적으로 해당 메서드 중 하나를 호출하여 상태 변경을 자동으로 알리는 소프트웨어 디자인 패턴입니다.
이벤트 기반 시스템을 구현하는 데 매우 유용한 패턴이며 동작 디자인 패턴 중 하나이기도 합니다.
관찰자 패턴은 주제라고 하는 개체가 관찰자라고 하는 종속 항목 목록을 유지 관리하고 일반적으로 해당 메서드 중 하나를 호출하여 상태 변경을 자동으로 알리는 소프트웨어 디자인 패턴입니다.
이벤트 기반 시스템을 구현하는 데 매우 유용한 패턴이며 동작 디자인 패턴 중 하나이기도 합니다.
관찰자 패턴에는 다음 참가자가 있습니다.
옵저버 패턴은 다음과 같은 상황에서 사용됩니다.
Kotlin에는 Observer Pattern이 내장되어 있지 않지만 구현하기 쉽습니다.
먼저 Subject 인터페이스를 생성해 보겠습니다.
interface Subject {
fun addObserver(observer: Observer)
fun removeObserver(observer: Observer)
fun notifyObservers()
}
보시다시피 Subject 인터페이스에는 세 가지 메서드가 있습니다.
이제 Observer 인터페이스를 생성해 보겠습니다.
interface Observer {
fun update(subject: Subject)
}
Observer 인터페이스에는 하나의 메서드만 있습니다.
이제 Subject 인터페이스를 구현하는 ConcreteSubject 클래스를 생성해 보겠습니다.
class ConcreteSubject : Subject {
private val observers = mutableListOf<Observer>()
private var state: Int = 0
override fun addObserver(observer: Observer) {
observers.add(observer)
}
override fun removeObserver(observer: Observer) {
observers.remove(observer)
}
override fun notifyObservers() {
for (observer in observers) {
observer.update(this)
}
}
fun setState(state: Int) {
this.state = state
notifyObservers()
}
fun getState(): Int {
return state
}
}
보시다시피 ConcreteSubject 클래스는 관찰자 목록을 유지하고 주제의 상태가 변경되면 이를 알립니다.
마지막으로 Observer 인터페이스를 구현하는 ConcreteObserver 클래스를 생성해 보겠습니다.
class ConcreteObserver : Observer {
private var state: Int = 0
override fun update(subject: Subject) {
state = subject.getState()
}
fun getState(): Int {
return state
}
}
ConcreteObserver 클래스는 단순히 주제의 상태를 저장하고 이에 액세스하기 위한 getter 메소드를 제공합니다.
이제 관찰자 패턴이 작동하는지 확인하는 테스트를 작성해 보겠습니다.
import org.junit.Test
import kotlin.test.assertEquals
class ObserverPatternTest {
@Test
fun testObserverPattern() {
val subject = ConcreteSubject()
val observer1 = ConcreteObserver()
val observer2 = ConcreteObserver()
subject.addObserver(observer1)
subject.addObserver(observer2)
subject.setState(1)
assertEquals(1, observer1.getState())
assertEquals(1, observer2.getState())
subject.setState(2)
assertEquals(2, observer1.getState())
assertEquals(2, observer2.getState())
subject.removeObserver(observer1)
subject.setState(3)
assertEquals(2, observer1.getState())
assertEquals(3, observer2.getState())
}
}
이 테스트에서는 먼저 ConcreteSubject와 두 개의 ConcreteObserver를 만듭니다. 그런 다음 주제에 관찰자를 추가하고 주제의 상태를 변경합니다. 그에 따라 관찰자의 상태가 변경되었다고 주장합니다. 마지막으로 관찰자 중 한 명을 제거하고 대상의 상태를 다시 변경합니다. 나머지 관찰자의 상태만 변경되었다고 주장합니다.