【设计模式】观察者模式和订阅发布模式

王柳  论坛元老 | 2024-8-21 02:39:25 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1021|帖子 1021|积分 3063

观察者模式

观察者模式包罗观察目的和观察者两类对象。一个目的可以有任意数目的与之相依靠的观察者。一旦观察目的的状态发生改变,全部的观察者都将得到关照。
当一个对象的状态发生改变时,全部依靠于它的对象都得到关照并被自动更新,解决了主体对象与观察者之间功能的耦合,即一个对象状态改变给其他对象关照的问题。
  1. class Subject {
  2.     constructor() {
  3.         this.observers = []
  4.     }
  5.     add(observer) {
  6.         this.observers.push(observer)
  7.     }
  8.     remove(observe) {
  9.         this.observers = this.observers.filter(observer => observer !== observe)
  10.     }
  11.     notify() {
  12.         this.observers.forEach(observer => {
  13.             observer.update()
  14.         })
  15.     }
  16. }
  17. class Observer {
  18.     constructor(name) {
  19.         this.name = name
  20.     }
  21.     update() {
  22.         console.log(this.name, 'update')
  23.     }
  24. }
  25. const subject = new Subject();
  26. const observer1 = new Observer('liu');
  27. const observer2 = new Observer('hao')
  28. subject.add(observer1)
  29. subject.add(observer2)
  30. subject.notify() // liu update hao update
复制代码
前端通常的应用是导航和面包屑,面包屑发生改变,对应的页面内容也会发生改变。
优势:目的者与观察者,功能耦合度降低,专注自身功能逻辑;观察者被动接收更新,时间上解耦,实时接收目的者更新状态。
缺点:观察者模式虽然实现了对象间依靠关系的低耦合,但却不能对事件关照举行细分管控,如“筛选关照”,“指定主题事件关照”。
订阅发布模式


  • 观察者和目的要相互知道
  • 发布者和订阅者不消互相知道,通过第三方实现调理,属于颠末解耦合的观察者模式

  1. // 发布订阅模式
  2. class PubSub {
  3.     constructor() {
  4.         this.subscribers = {};
  5.     }
  6.     subscribe(type, callback) {
  7.         if (!this.subscribers[type]) {
  8.             this.subscribers[type] = [];
  9.         }
  10.         this.subscribers[type].push(callback);
  11.     }
  12.     publish(type, ...args) {
  13.         if (this.subscribers[type]) {
  14.             this.subscribers[type].forEach(callback => {
  15.                 callback(...args);
  16.             });
  17.         }
  18.     }
  19.     unsubscribe(type, callback) {
  20.         if (this.subscribers[type]) {
  21.             this.subscribers[type] = this.subscribers[type].filter(cb => cb !== callback);
  22.         }
  23.     }
  24. }
  25. function eventA() {
  26.     console.log('eventA');
  27. }
  28. function testB() {
  29.     console.log('testB');
  30. }
  31. const pubSub = new PubSub();
  32. pubSub.subscribe('eventA', eventA);
  33. pubSub.subscribe('testB', testB);
  34. pubSub.publish('eventA');
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表