当前位置: 代码迷 >> 综合 >> Observer/Event(观察者模式)
  详细解决方案

Observer/Event(观察者模式)

热度:82   发布时间:2023-12-15 01:46:09.0

一个不错的视频教程: 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

  相关解决方案