Kotlin设计模式:观察者模式

null
kotlin与java基本使用方法一样,不过写法更简洁。

观察者,感觉就是多个事件源与一个订阅者,订阅者订阅多个事件源,当订阅者接收数据时候,所有的事件源都触发并更新数据。

换成观察者,就是,一个目标对象状态改变,其它观察它的对象都收到通知,并改变,像广播一样。

用kotlin代码实现如下:之前在菜鸟写过笔记,有一处错误,被观察者后面的 订阅者 -》修改为 被订阅者。

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
* 观察者
*/
interface Observer {
fun <T : Any?> update(msg: T)
}

/**
* 观察者1,2,3
*/
class Ob1(private val id: Int = 0) : Observer {
override fun <T> update(msg: T) {
println("接收消息,观察者$id:$msg")
}
}
//这里是kotlin的类委托
class Ob2 : Observer by Ob1(2)
class Ob3 : Observer by Ob1(3)

/**
* 被观察者(被订阅)
*/
class Subject {

//存放观察者
private var observers = ArrayList<Observer>()
//订阅观察者
fun attach(ob: Observer) {
observers.add(ob)
}
//设置数据
fun <T : Any?> setMsg(msg: T) {
this.notify(msg)
}
//更新数据
private fun <T : Any?> notify(msg: T) {
for (iOb in this.observers) {
iOb.update(msg)
}
}
}

/**
* Kotlin版 观察者模式
* @author IWH
* Des:kotlin1.3支持主函数省略参数
*/
fun main() {

val sub = Subject().apply {
attach(Ob1())
attach(Ob2())
attach(Ob3())
}
with(sub){
setMsg(123)
setMsg("hello world")
setMsg('A')
setMsg(null)
}
}

null

输出:

null