-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobservable_pattern.kt
47 lines (34 loc) · 1.16 KB
/
observable_pattern.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// https://pl.kotl.in/EMC0YAZ2Z
/** Observalbe Pattern */
fun main() {
val userOne = User("John Doe", "Joe")
userOne.observe { it -> print(it) }
userOne.setNickName("John")
userOne.setNickName("Wick")
}
class User(private var fullName: String, private var nickName: String) : Subject<User> {
fun setFullName(fullName: String) {
this.fullName = fullName
notifyObservers()
}
fun setNickName(nickName: String) {
this.nickName = nickName
notifyObservers()
}
override fun toString() = "NickName : $nickName FullName : $fullName"
// Obervable Pattern Contents
private val observers: ArrayList<Observalbe<User>> = ArrayList()
override fun observe(observer: Observalbe<User>) = observers.add(observer)
override fun removeObserver(observer: Observalbe<User>) = observers.remove(observer)
override fun notifyObservers() {
for (observer in observers) observer.update(this)
}
}
interface Subject<T> {
fun observe(observer: Observalbe<T>): Boolean
fun removeObserver(observer: Observalbe<T>): Boolean
fun notifyObservers()
}
fun interface Observalbe<T> {
fun update(any: T)
}