Observer Interface
interface Observer {
fun update()
}
Subject Interface
interface Subject {
fun register(obj: Observer)
fun unregister(obj: Observer)
fun notifyObservers()
fun getUpdate(obj: Observer): String
}
Topic Class
class Topic : Subject {
private val observers: MutableSet<Observer> = mutableSetOf()
private var message: String = ""
override fun register(obj: Observer) {
observers.add(obj)
}
override fun unregister(obj: Observer) {
observers.remove(obj)
}
override fun notifyObservers() {
observers.forEach(Observer::update)
}
override fun getUpdate(obj: Observer): String {
return message
}
fun postMessage(message: String) {
println("Enter the message: $message")
this.message = message
notifyObservers()
}
}
TopicSubscriber Class
class TopicSubscriber(
private val name: String,
private val topic: Subject
) : Observer {
override fun update() {
val msg = topic.getUpdate(this)
println("$name got notified about $msg")
}
}
Main Kt
주제 서식자 클래스
fun main() {
val topic = Topic()
val a = TopicSubscriber("a", topic)
val b = TopicSubscriber("b", topic)
val c = TopicSubscriber("c", topic)
topic.register(a)
topic.register(b)
topic.register(c)
topic.postMessage("hello world!")
}
Output
소스코드
https://github.com/Kuass/KotlinObserverPattern 에서 확인 가능합니다.
반응형