1.软文推荐

2.软文推荐

3.软文推荐

之前一直对观察者模式和发布订阅模式的区别理解不深,正好这段时间在看vue源码的分析,vue数据双向绑定也用到了发布订阅模式,于是又把这两者探究了一番,今天做个笔记加强印象。

观察者模式和发布订阅模式最大的区别就是发布订阅模式有个事件调度中心。

从图中可以看出,观察者模式中观察者和目标直接进行交互,而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制之类的。还可以做一些节流操作。

接下来看一下代码实现
观察者模式:

// 观察者
class Observer {
    constructor() {

    }
    update(val) {

    }
}
// 观察者列表
class ObserverList {
    constructor() {
        this.observerList = []
    }
    add(observer) {
        return this.observerList.push(observer);
    }
    remove(observer) {
        this.observerList = this.observerList.filter(ob => ob !== observer);
    }
    count() {
        return this.observerList.length;
    }
    get(index) {
        return this.observerList[index];
    }
}
// 目标
class Subject {
    constructor() {
        this.observers = new ObserverList();
    }
    addObserver(observer) {
        this.observers.add(observer);
    }
    removeObserver(observer) {
        this.observers.remove(observer);
    }
    notify(...args) {
        let obCount = this.observers.count();
        for (let index = 0; index 

发布订阅模式:

class PubSub {
    constructor() {
        this.subscribers = {}
    }
    subscribe(type, fn) {
        if (!Object.prototype.hasOwnProperty.call(this.subscribers, type)) {
          this.subscribers[type] = [];
        }
        
        this.subscribers[type].push(fn);
    }
    unsubscribe(type, fn) {
        let listeners = this.subscribers[type];
        if (!listeners || !listeners.length) return;
        this.subscribers[type] = listeners.filter(v => v !== fn);
    }
    publish(type, ...args) {
        let listeners = this.subscribers[type];
        if (!listeners || !listeners.length) return;
        listeners.forEach(fn => fn(...args));        
    }
}

let ob = new PubSub();
ob.subscribe('add', (val) => console.log(val));
ob.publish('add', 1);

从上面代码可以看出,观察者模式由具体目标调度,每个被订阅的目标里面都需要有对观察者的处理,会造成代码的冗余。而发布订阅模式则统一由调度中心处理,消除了发布者和订阅者之间的依赖。

观察者模式跟我们平时用的事件也有一定的关系,比如:

ele.addEventListener('click', () => {});

addEventListener就相当于注册了一个观察者,当观察到‘click’事件的时候,作出一些处理。

本文来源:www.lxlinux.net/9182.html,若引用不当,请联系修改。

相关文章 8

1

Linux Deploy安装教程 2分钟前

Linux Deploy 是一个在 Android 上运行的 chroot 容器。使用 Linux Deploy,通过简单的操作,可实现运行 Debian/Ubuntu 等多个流行的 Linux 发行版本。下面...

2

阿里云盘福利(阿里云盘福利码12月) 4分钟前

目录:1、阿里云盘重磅功能更新,网盘使用的最大痛点解决了2、阿里云盘兑换福利码有哪些3、阿里云盘怎么免费得10t永久4、阿里云盘福利...

3

RHEL7中常用的网络命令 5分钟前

无论你是要下载文件、诊断网络问题、管理网络接口,还是查看网络的统计数据,都有终端命令可以来完成,本篇文章重点为大家讲解一下...

4

枣庄vps主机(山东枣庄vps) 6分钟前

目录:1、vps和虚拟主机的区别2、VPS、虚拟机、云主机,这三个到底有什么区别?3、vps和云主机的区别是什么?4、vps,虚拟主机,云主机是...

5

Linux常用命令—pgrep命令 9分钟前

Linux常用命令 pgrep命令 以名称为依据从运行进程队列中查找进程,并显示查找到的进程id,下面良许教程网为大家分享一下Linux常用命令pgr...

6

详解GIit基本使用方法 11分钟前

本篇文章重点为大家分享一下gir中的常用方法和操作,有需要的小伙伴可以参考一下。 创建版本库 $git clone #克隆远程版本库 $gitinit #初始化...

7

湖北十堰机房(湖北十堰机房直销) 12分钟前

目录:1、湖北省十堰市介绍2、谁知道移动宽带的原理,光缆是怎么走的,通过什么设备到户3、湖北省十堰市第二中学的电话是多少?湖北...

8

通过eNSP实现静态NAT转换 13分钟前

eNSP是图形化网络仿真平台,该平台通过对真实网络设备的仿真模拟。网络转换技术也叫做NAT技术,他的作用就是实现私网IP和公网IP 的转换来...