Created
March 4, 2020 16:42
-
-
Save wesleybliss/7d3826ee1ef61e2eb10c8efb30b16b8c to your computer and use it in GitHub Desktop.
Simple Kotlin Observer Pattern
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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