一个不错的视频教程: https://www.bilibili.com/video/av41443026/?p=1
个人理解: 有一款车,两个人都想买,一个男人一个女人,所以老板让他们关注了这个车的订阅号,每当车的价格有变动,男人和女人都能得到通知,这就是观察者模式,车就是被观察者,男人和女人就是观察者
解决问题: 在软件构建过程中,我们需要为某些对象建立一种一对多的“通知依赖关系”,当一个对象的状态发生改变,所有的依赖对象都能得到通知
举个例子:
车是被观察者 它可以 添加观察者 删除观察者 通知各个观察者 咱们依据这个规则生成一个接口
interface Observable { //被观察者
fun add(observer: Observer) // 添加一个观察者 (这其中的参数observer,是下文中将新建的观察者接口)
fun remove(observer: Observer) // 删除一个观察者
fun mnotify() // 通知各个观察者
}
我们的车是被观察者 所以它要实现这个接口
class Car(private var price: Float) : Observable { //被观察者:车 (构造参数中有一个传入的价格)
private var list: MutableList<Observer> = ArrayList()
override fun add(observer: Observer) { // 添加观察者
list.add(observer)
}
override fun remove(observer: Observer) { // 移除观察者
list.remove(observer)
}
override fun mnotify() { // 通知方法
for (observer in list) { // 遍历通知每个观察者
observer.update(price)
}
}
}
我们的观察者关心的是是价格,所以我们抽象一个获取价格的接口:
interface Observer { //观察者
fun update(price:Float) //更新价格
}
男人女人都是观察者所以都要实现此接口:
男人:
class Man : Observer { //观察者:男人
override fun update(price:Float) {
Log.e("AAA","男人:车价是 $price")
}
}
女人:
class Woman : Observer { //观察者:女人
override fun update(price:Float) {
Log.e("AAA","女人:车价是 $price")
}
}
然后看观察者模式的运行:
val 奔驰 = Car(300000f) //通过车类,实例化一个奔驰,它的价格是30w
val 小明= Man() //通过男人类 , 实例化一个具体男人,小明
val 小红= Woman() //通过女人类 , 实例化一个具体女人,小红
奔驰 .add(小明) //小明订阅了奔驰的通知
奔驰 .add(小红) //小红订阅了奔驰的通知
奔驰 .remove(小红) //小红因为和老板吵架取消了订阅的通知
奔驰 .mnotify() //奔驰 把价格发送给订阅者
结果: 男人:车价是 300000.0