找回密码
 立即注册
首页 业界区 业界 行为型:观察者模式

行为型:观察者模式

谅潭好 2025-6-6 09:36:56
定义

观察者模式属于行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。
一种一对多的关系中一称为被观察者也叫目标对象Subject而多则称为观察者对象Observer

观察者模式中通常有两个模型,一个观察者(observer)和一个被观察者(Observed)。从字面意思上理解,即被观察者发生某些行为或者变化时,会通知观察者,观察者根据此行为或者变化做出处理。

特征:


    • 一个目标者对象 Subject,拥有方法:添加、删除、通知 Observer;
    • 多个观察者对象 Observer,拥有方法:接收 Subject 状态变更通知并处理;
    • 目标对象 Subject 状态变更时,通知所有 Observer。

生活中的例子


  如我们关注了某某订阅号,当订阅号有新的文章时,我们都收到了推文,这个就是最简单的观察者模式。

模拟观察者模式
  1. /*
  2. 定义:
  3. 观察者模式是一种对象行为模式。
  4. 它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  5. js 没有抽象类、接口 所以一般结构如下:
  6. subject 目标 or 被观察者:
  7.   add: 把观察者注册进来
  8.   remove: 移除观察者
  9.   notify: 遍历注册进来的观察者,调用他们的update
  10. Observer 观察者:
  11.   update: 自己提供的更新方法
  12. */
  13. // 被观者、目标
  14. class Subject {
  15.   constructor (data) {
  16.     this.observers = []
  17.     this.data = data
  18.   }
  19.   addObserver (data) {
  20.     this.observers.push(data)
  21.   }
  22.   removeObserver (data) {
  23.     this.observers = this.observers.filter(t => t !== data)
  24.   }
  25.   notify (...data) {
  26.      this.observers.forEach(observer => observer.update(...data))
  27.   }
  28.   // 你的业务代码
  29.   setData (data) {
  30.     this.data= data;
  31.     this.notify(data)
  32.   }
  33. }
  34. // 观察者
  35. class Observer {
  36.   constructor (name) {
  37.     this.name = name
  38.   }
  39.   update (data) {
  40.     console.log(`${this.name}, 我执行了,${data}发生了变化`)
  41.   }
  42. }
  43. const sub = new Subject('我是被观察')
  44. const ob1 = new Observer('我是ob1')
  45. const ob2 = new Observer('我是ob2')
  46. const ob3 = new Observer('我是ob3')
  47. sub.addObserver(ob1)
  48. sub.addObserver(ob2)
  49. sub.addObserver(ob3)
  50. sub.notify('现在开始发送第一个通知')
  51. console.log('**************看看ob1 是不是没有收到第二个通知**************')
  52. sub.removeObserver(ob1)
  53. sub.notify('现在开始发送第二个通知')
复制代码
 小结



  • 观察者模式用来解决对象之间存在一对多关系的交互行为
  • 观察者模式中,被观察者与观察者解藕没有很彻底,且在被观察者中观察者要提供统一的更新方法,当然这也是要看具体的应用场景,在某些模块本身就是存在关联,那用观察者模式也没问题。
  • 发布订阅虽然与观察者模式解决的问题的思路差不多,但是这两个还是有区别的。  

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册