一个不错的视频教程: 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) //通过车类,实例化一个奔驰,它的价格是30wval 小明= Man() //通过男人类 , 实例化一个具体男人,小明val 小红= Woman() //通过女人类 , 实例化一个具体女人,小红奔驰 .add(小明) //小明订阅了奔驰的通知奔驰 .add(小红) //小红订阅了奔驰的通知奔驰 .remove(小红) //小红因为和老板吵架取消了订阅的通知奔驰 .mnotify() //奔驰 把价格发送给订阅者
结果: 男人:车价是 300000.0