Skip to content

Instantly share code, notes, and snippets.

@wesleybliss
Created March 4, 2020 16:42
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save wesleybliss/7d3826ee1ef61e2eb10c8efb30b16b8c to your computer and use it in GitHub Desktop.
Save wesleybliss/7d3826ee1ef61e2eb10c8efb30b16b8c to your computer and use it in GitHub Desktop.
Simple Kotlin Observer Pattern
interface Observer<T> {
fun onChange(newValue: T?)
}
class Observable<T>(initialValue: T? = null) {
// List ov observers watching this value for changes
private val observers = mutableListOf<Observer<T>>()
// The real value of this observer
// Doesn't need a custom getter, but the setter
// we override to allow notifying all observers
var value: T? = initialValue
set(value) {
field = value
notifyObservers()
}
fun observe(observer: Observer<T>) {
observers.add(observer)
}
private fun notifyObservers() {
observers.forEach { observer ->
observer.onChange(value)
}
}
}
// Extension function so we don't need to instantiate IObserver
fun <T> Observable<T>.observe(block: (T?) -> Unit) {
observe(object : Observer<T> {
override fun onChange(newValue: T?) {
block(newValue)
}
})
}
fun main() {
// New observable with false initial value
val skyIsBlue = Observable<Boolean>(false)
// Normal way to observe (too verbose, so use extension fun below
/*skyIsBlue.observe(object : IObserver<T> {
override fun onChange(newValue: T?) {
// ...
}
})*/
// Add an observer to get change updates
skyIsBlue.observe {
println("Observer hit, new value = $it")
}
// Now change the value - the observer should hit
skyIsBlue.value = true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment