[kotlin] 코틀린으로 구현하는 옵서버 디자인 패턴 예시

옵서버 디자인 패턴은 객체의 상태 변화를 관찰하는 데 사용됩니다. 이 패턴은 주로 MVC(Model-View-Controller) 모델에서 상태 변화를 추적하고 적절한 응답을 수행하기 위해 많이 사용됩니다. 코틀린을 사용하여 간단한 예시를 통해 옵서버 디자인 패턴을 구현해 보겠습니다.

Subject (주제)

Subject는 옵서버(Observer) 객체를 등록하고 제거하는 메서드를 가지고 있으며, 옵서버 객체들에게 상태 변화를 알리는 역할을 합니다.

interface Subject {
    fun registerObserver(observer: Observer)
    fun removeObserver(observer: Observer)
    fun notifyObservers()
}

Concrete Subject (구체적인 주제)

구체적인 주제는 Subject를 구현한 클래스로, 상태의 변화가 발생할 때 옵서버들에게 알리는 역할을 수행합니다.

class ConcreteSubject : Subject {
    private val observers = mutableListOf<Observer>()
    private var state: Int = 0

    fun setState(state: Int) {
        this.state = state
        notifyObservers()
    }

    override fun registerObserver(observer: Observer) {
        observers.add(observer)
    }

    override fun removeObserver(observer: Observer) {
        observers.remove(observer)
    }

    override fun notifyObservers() {
        for (observer in observers) {
            observer.update(state)
        }
    }
}

Observer (옵서버)

옵서버는 Subject에서 발생하는 상태의 변화를 감지하고 이에 대한 응답을 정의합니다.

interface Observer {
    fun update(state: Int)
}

Concrete Observer (구체적인 옵서버)

구체적인 옵서버는 Observer를 구현한 클래스로, Subject의 상태 변화에 대한 구체적인 응답을 정의합니다.

class ConcreteObserver(private val name: String) : Observer {
    override fun update(state: Int) {
        println("$name: State is now $state")
    }
}

메인 함수

fun main() {
    val subject = ConcreteSubject()
    val observer1 = ConcreteObserver("Observer 1")
    val observer2 = ConcreteObserver("Observer 2")

    subject.registerObserver(observer1)
    subject.registerObserver(observer2)

    subject.setState(1)
    subject.setState(2)

    subject.removeObserver(observer1)
    subject.setState(3)
}

옵서버 디자인 패턴을 구현하는 과정에 대한 간단한 예시를 코틀린으로 작성해 보았습니다. 이를 통해 객체의 상태 변화를 감지하고 이에 대한 적절한 응답을 수행하는 방법을 쉽게 이해할 수 있습니다.

참고 문헌: