真是不爽啊,刚写的东西合并账号之后,不见了,还要重写,让我这么懒的人如何是好。
我们今天是记录一下这几天学习和使用的观察者模式,
首先我们需要知道什么是观察者模式
定义
说是定义其实是我个人给他的定义,就是一个被观察者和多个观察者之间的爱恨情仇,也就是被观察者定义一个集合存放所有的观察者,当需要通知的时候遍历集合去通知各个观察者
官方定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(菜鸟教程)
使用优缺点和场景
1,使用观察者可以降低类/对象之间的耦合,通俗的讲我们只需要知道我们自己的身份,不需要知道其他人的身份,互相之间没有过多的接触。
2,符合开闭原则,定义了观察者和被观察者的实现接口 ,我们只需要去实现定义的接口就好,需要修改或新增只需要修改我们定义的实现接口,不需要改变对象/类。
3,当一个对象的资源或属性改变需要通知其他的对象做出相应的更新此时观察者模式可以是我们的选择(在这方面其他感觉跟EventBus 差不多)
使用
观察者模式分为两块
1,观察者 :简单的使用就是我们只需要在观察者中定义一个通知接收的方法即可
2,被观察者:我们需要提供添加观察者的方法,移除观察者的方法,以及通知观察者更新的方法,再观察这种我们需要定义用来存储观察者对象的集合
鲜花 掌声 让我们请出例子
德莫
首先我们定义的是观察者接口
/*
* 定义观察者 接口
* */
interface Observer {
fun receivedMsg(msg: String)
}
是不是跟我上面说的一样很简单,我们只需要一个接收更新的方法就可以了
接下来我们请出 我们的被观察者 撒花
/*
* 定义被观察者 接口
* */
interface Observed {
// 提供 添加观察者 方法
fun add(observer: Observer)
//提供 移除被观察者 方法
fun remove(observer: Observer)
//通知 观察者方法
fun notifyAll(msg: String)
}
注释写的我都不想解释了,是不是很简单易懂。
我们定义好了观察者和被观察者接口之后 这个时候我们需要给出一个场景,怎么去使用观察者模式呢,我们 定义的接口如何使用呢?
下面 小石我来给出一个适用场景:
现在呢 有一个小学学校的老师 想要通知班里同学的家长一个消息, 通知什么呢 ‘周末 要上课啊 !!!’,是的就是周末要上课,毕竟快高考了。有人会说高考跟小学生有啥关系?非也 我们要从小抓起,从小就要开始重视高考。开个玩笑哈!!
那么请问这个场景下我们怎么去通知所有的家长呢,有人会跟我说:小石 啊,直接微信群里就可以通知了! 啊噗,我想踢死你~~
其实呢我们的观察者模式跟这个模式其实也差不多 都是一种媒介。
闲话少说 我们代码伺候:
首先我们定义 对象群—>家长 == 观察者
inner class ParentA : Observer {
override fun receivedMsg(msg: String) {
println("$TAG 家长A 收到通知$msg")
}
}
inner class ParentB : Observer {
override fun receivedMsg(msg: String) {
println("$TAG 家长B 收到通知$msg")
}
}
inner class ParentC : Observer {
override fun receivedMsg(msg: String) {
println("$TAG 家长C 收到通知$msg")
}
}
接下来我们来定义对象---->老师 == 被观察者
inner class Teacher : Observed {
private val mList = ArrayList<Observer>()
override fun add(observer: Observer) {
mList.add(observer)
}
override fun remove(observer: Observer) {
if (mList.contains(observer)) {
mList.remove(observer)
}
}
override fun notifyAll(msg: String) {
for (i in mList.indices) {
mList[i].receivedMsg(msg)
}
}
}
那么到此,我们的观察者和被观察者都已经创建完成了,接下来就是如果去使用被观察者去通知所有的观察者了,各位观众大老爷,请别眨眼~~~
@Test
fun startNotify() {
val parentA = ParentA()
val parentB = ParentB()
val parentC = ParentC()
val teacher = Teacher()
teacher.add(parentA)
teacher.add(parentB)
teacher.add(parentC)
teacher.notifyAll("周末 要上课啊 !!!")
}
接下来我们就是来验证我们的最终成果的时候了
家长A 收到通知周末 要上课啊 !!!
家长B 收到通知周末 要上课啊 !!!
家长C 收到通知周末 要上课啊 !!!
如我们所愿,我们通过被观察者的通知,每个观察者都收到了 通知消息,有的同学会问我,那么我们怎么在Android 应用里面使用观察者模式呢。这个问题问的好,如果有缘的话,我们还会再见的。
bye bye了您嘞!!!