IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 观察者模式和发布订阅者模式不是一回事? -> 正文阅读

[JavaScript知识库]观察者模式和发布订阅者模式不是一回事?

什么是观察者模式?

观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发观察者里的事件。

观察者模式的代码实现

// 被观察者
class Subject {
    constructor(name) {
        this.state = '开心';
        // 存储所有的观察者
        this.observers = [];
    }
    // 收集所有的观察者
    attach(o) {
        this.observers.push(o);
    }
    // 状态更新时,更新状态并通知所有的观察者
    setState(newState) {
        this.state = newState;
        this.observers.forEach(item => item.update(this));
    }
}

// 观察者
class Observer {
    constructor(name) {
        this.name = name;
    }
    // 接受被观察者通知的函数
    update(student) {
        console.log('观察者:' + this.name + '被观察者现在的状态是:' + student.state);
    }
}

let student = new Subject('学生'); 

let parent = new Observer('父母'); 
let teacher = new Observer('老师'); 

// 被观察者存储观察者的前提,需要先接纳观察者
student.attach(parent); 
student.attach(teacher); 
student.setState('正在好好学习~');

什么是发布订阅模式?

订阅者(Subscriber)把自己想订阅的事件注册到调度中心,当发布者(Publisher)发布该事件到调度中心,由调度中心统一调度订阅者注册到调度中心的处理代码。

发布订阅模式代码实现

class EventEmitter {
    constructor() {
        // 事件对象,存放订阅的名字和事件
        this.events = {};
    }
    // 订阅事件的方法
    on(eventName,callback) {
        // 如果事件对象中没有这个事件
        if (!this.events[eventName]) {
            // 以数组的形式存放,方便后续的存放
            this.events[eventName] = [callback];
        } else {
            this.events[eventName].push(callback);
        }
    }
    // 触发事件的方法
    emit(eventName) {
        // 如果这个事件名存在的话,则执行对应事件数组的所有事件
        this.events[eventName] && this.events[eventName].forEach(cb => cb());
    }
}
let em = new EventEmitter();
function workDay() {
  console.log("日事日毕,绝不拖延~");
}
function makeMoney() {
  console.log("工作挣钱");
}
function sayLove() {
  console.log("love");
}
em.on("money",makeMoney);
em.on("love",sayLove);
em.on("work", workDay);

em.emit("money");
em.emit("love");  
em.emit("work");

一张图看懂二者的区别

image.png

区别一:从角色角度看

  1. 发布订阅模式需要三种角色,发布者、调度中心和订阅者。
  2. 观察者模式需要两种角色,观察者和被观察者。

区别二:从耦合度上来看

  1. 发布订阅者模式是一个事件中心调度模式,订阅者和发布者是没有直接关联的,通过调度中心进行关联,二者是解耦的。
  2. 观察者模式中观察者和被观察者是关联在一起的,耦合在一起。
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:32:12  更:2022-04-18 17:35:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:13:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码