发布订阅和观察者模式的区别

更新日期: 2020-02-25阅读: 2k标签: 模式

有些人认为观察者模式就是发布订阅模式,实际上观察者模式是包含了订阅发布模式,发布订阅模式只是观察者模式中的一种。观察者模式是观察者和被观察者之间的通信,而发布订阅模式中间增加了一个中转层,通过第三方来分发信息。


观察者模式

    // Subject为被观察者,Subject中的状态(state)改变,就通知 Observer更新
    class Subject {
      constructor() {
        this.observes = []
        this.state = false
      }
      // this.observes存储观察者
      attach(observe){
        this.observes.push(observe)
      }
      // 状态改变,通知 Observer 触发更新
      setState(newState){
        this.state = newState
        this.observes.forEach( observer => observer.update(newState))
      }
    }
    // Observer为观察者,观察Subject的状态是否改变
    class Observer {
      constructor(name) {
        this.name = name
      }
      // 更新
      update(state){
        console.log(this.name + ",接收到了通知,被观察者的属性变为 " + state)
      }
    }
    var sub = new Subject()
    var obs1 = new Observer('观察者1')
    var obs2 = new Observer('观察者2')
    sub.attach(obs1)
    sub.attach(obs2)
    // 被观察者的状态改变,触发观察者更新
    sub.setState(true) 

vue数据劫持中就用到了观察者模式,data中的属性一发生变化,就通知view界面更新,从而实现数据驱动,想要进一步了解vue底层原理,可以参考可以参考github上的一篇文章  MVVM实现


发布订阅模式

 // 发布订阅
    class Events {
      constructor() {
        this.sub = {} // 容器
      }
      // 根绝不同 name,订阅对应函数
      $on(name, fn) {
        const wrap = this.sub[name] || (this.sub[name] = [])
        wrap.push(fn)
      }
      // 遍历所有相同name的订阅函数,并发布
      $emit(name, ...args) {
        const fns = this.sub[name] || []
        fns.forEach(fn => {
          fn.apply(this, args)
        })
      }
      // 销毁,避免内存泄漏
      $of(name){
        this.sub[name] = null
      }
    }
    // event 相当于中转器
    const event = new Events()
    // 订阅
    event.$on('eventname', function (a, b) {
      console.log(a, b)
    })
    event.$on('eventname', function (a, b) {
      console.log(a, b)
    })
    // 发布
    event.$emit('eventname', 'a', 'b')

vue中的兄弟组件通信bus的原理就是发布订阅模式,该模式有个缺点,当你订阅一个消息后,也许此消息最后都未发生,但这个订阅者会始终存在于内存中。所以该消息不使用的时候,调用$of销毁,以避免内存泄漏。


总结

总而言之,在观察者模式中,观察者(Observer)是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布订阅通过共享全局状态,往往更多执行异步事件~~~~。

原文:https://segmentfault.com/a/1190000021830101

链接: https://www.fly63.com/article/detial/7657

js设计模式之单例模式,javascript如何将一个对象设计成单例

单例模式是我们开发中一个非常典型的设计模式,js单例模式要保证全局只生成唯一实例,提供一个单一的访问入口,单例的对象不同于静态类,我们可以延迟单例对象的初始化,通常这种情况发生在我们需要等待加载创建单例的依赖。

前端设计模式:从js原始模式开始,去理解Js工厂模式和构造函数模式

工厂模式下的对象我们不能识别它的类型,由于typeof返回的都是object类型,不知道它是那个对象的实例。另外每次造人时都要创建一个独立的person的对象,会造成代码臃肿的情况。

JavaScript设计模式_js实现建造者模式

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象

html和xhtml,DOCTYPE和DTD,标准模式和兼容模式

主要涉及知识点: HTML与XHTML,HTML与XHTML的区别,DOCTYPE与DTD的概念,DTD的分类以及DOCTYPE的声明方式,标准模式(Standard Mode)和兼容模式(Quircks Mode),标准模式(Standard Mode)和兼容模式(Quircks Mode)的区别

前端四种设计模式_JS常见的4种模式

JavaScript中常见的四种设计模式:工厂模式、单例模式、沙箱模式、发布者订阅模式

javascript 策略模式_理解js中的策略模式

javascript 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句,策略模式提供了开放-封闭原则,使代码更容易理解和扩展, 策略模式中的代码可以复用。

javascript观察者模式_深入理解js中的观察者模式

javascript观察者模式又叫发布订阅模式,观察者模式的好处:js观察者模式支持简单的广播通信,自动通知所有已经订阅过的对象。存在一种动态关联,增加了灵活性。目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。

Vue中如何使用方法、计算属性或观察者

熟悉 Vue 的都知道 方法methods、计算属性computed、观察者watcher 在 Vue 中有着非常重要的作用,有些时候我们实现一个功能的时候可以使用它们中任何一个都是可以的

我最喜欢的 JavaScript 设计模式

我觉得聊一下我爱用的 JavaScript 设计模式应该很有意思。我是一步一步才定下来的,经过一段时间从各种来源吸收和适应直到达到一个能提供我所需的灵活性的模式。让我给你看看概览,然后再来看它是怎么形成的

Flutter 设计模式 - 简单工厂

在围绕设计模式的话题中,工厂这个词频繁出现,从 简单工厂 模式到 工厂方法 模式,再到 抽象工厂 模式。工厂名称含义是制造产品的工业场所,应用在面向对象中,顺理成章地成为了比较典型的创建型模式

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!