首页 > 其他分享 >观察者模式和发布订阅模式

观察者模式和发布订阅模式

时间:2023-03-17 11:45:23浏览次数:32  
标签:订阅 name 观察者 模式 events fn subject

首先我们必须清楚这两种模式都是设计模式,而不是某种语言的专属;

观察者模式(Observer)

概念理解

  • 观察者模式是一种一对多的依赖关系的行为设计模式,让多个观察者对象监听一个主题对象,当主题对象发生变化时,它的所有观察者对象都会收到通知并自动更新。它可以让多个观察者对象同时监听一个主题对象,当主题对象发生变化时,可以同时通知所有观察者对象,让它们做出相应的反应;
  • Subject(被观察者)改变 --->Observer(观察者)监听到其改变,更新自己;

代码实现

//观察者模式:Subject(被观察者);Observer(观察者)
class Subject{
  constructor() {
    // 记录所有的观察者
    this.observers = []
  }
  //添加新的观察者
  addObserver() {
    this.observers.push(observer)
  }
  //移除观察者
  removeObserver() {
    let index = this.observers.indexOf(observer)
    if(index !== -1) {
      this.observers.splice(index, 1)
    }
  }
  //发布更新通知
  notify() {
    this.observers.forEach(observer => {
      observer.update()
    })
  }
}

class Observer {
  update() {
    console.log('subject has updated!');
  }
  subscribeTo(subject) {
    subject.addObserver()
  }
}
let subject = new Subject() //被观察者
let observer1 = new Observer()  //观察者
observer1.subscribeTo(subject) //观察者进行订阅
let observer2 = new Observer()  //观察者
observer2.subscribeTo(subject) //观察者进行订阅
subject.notify()

发布订阅模式(Publisher)

概念理解

  • 发布订阅模式也是一种一对多的依赖关系的行为设计模式,它可以让发布者和订阅者解耦,发布者和订阅者之间不需要知道对方的存在,发布者只需要发布消息,订阅者只需要订阅消息,当发布者发布消息时,订阅者会收到消息;
  • Publisher(发布者)改变 --->消息管道接受并通知Subscriber(订阅者) --->Subscriber(订阅者)收到通知并发生变化;

代码实现

class EventEmitter {
  constructor() {
    this.events = {}
  }
  on(name, fn) {
    if (this.events[name]) {
      this.events[name].push(fn)
    } else {
      this.events[name] = [fn]
    }
  }
  off(name, fn) {
    const tasks = this.events[name]
    if (tasks) {
      const index = tasks.findIndex((f) => f === fn || f.callback === fn)
      if (index >= 0) {
        tasks.splice(index, 1)
      }
    }
  }
  // once:是否只发生一次
  emit(name, once = false) {
    if (this.events[name]) {
      //  创建副本,如果回调函数内继续注册相同事件,会造成死循环
      const tasks = this.events[name].slice()
      for (let fn of tasks) {
        fn()
      }
      if (once) {
        delete this.events[name]
      }
    }
  }
}

标签:订阅,name,观察者,模式,events,fn,subject
From: https://www.cnblogs.com/rain111/p/17226129.html

相关文章

  • 设计模式——享元模式
    个人理解:抽离公共方法所需的属性进行共享;不需要的字段抽离到外面进行管理。1、享元模式享元模式(FlyweightPattern)主要用于减少创建对象的数量,以减少内存占用和提高性能......
  • Nginx负载均衡的三种模式
    1、轮询模式轮询模式是根据访问时间,之一分配到不同的后端服务器,并且后端服务器如果down掉了,Nginx还会自动剔除这个失效的地址,适合服务器配置相当,无状态且短平快的服务......
  • 设计模式5——模板方法模式
    1、定义模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。2、核心在抽象父类中封装子类的算法框架,它的init方法可作为一个算法的模板,指导子......
  • 请你谈谈单例模式的优缺点,注意事项,使用场景
    单例模式(Singleton),是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整......
  • 设计模式(二十三)----行为型模式之中介者模式
    1概述一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下......
  • 16.(行为型模式)java设计模式之责任链模式
    一、什么是责任链模式模式(ChainofResponsibility)客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。让多个对象都有机会处......
  • vue-router的两种模式
    hash和history区别:外观上:hash的路由在url中带有#号功能上:hash虽然在url中,但是请求不会包裹它,对后端不会产生任何影响,改变hash不会重新加载页面。history是利用了htm......
  • 【设计模式】模板方法
    1.模板方法(TemplateMethod)的定义模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。模板是对多种事物的结......
  • 设计模式之装饰者模式,奶茶店场景
    //Seehttps://aka.ms/new-console-templateformoreinformationusingSystem.Drawing;/*装饰者模式,不改变实现类的情况下,动态给实现类增加新功能,这里使用聚合......
  • 设计模式1——单例模式
    单例模式:在使用构造函数时,保证全局只有一个new出来的对象,后续无论如何调用,都是显示为第一次构造的对象;需更改内部属性,可以通过提供函数接口更改核心:确保只有一个实例,并......