观察者和发布订阅模式

本文介绍了观察者模式和发布订阅模式的实现与应用场景。观察者模式中,发布者直接管理并通知所有观察者,而发布订阅模式通过事件中心使发布者与订阅者解耦,实现松耦合。在实际应用中,观察者模式通常同步调用,发布订阅模式常异步处理。
摘要由CSDN通过智能技术生成

前言

设计模式可以说是反反复复看了很多遍,从懵懂到现在在代码中经常使用,其实最重要的是设计模式里面的思想,不要被高大上的名字所唬住,在这里复习一下观察者模式和发布订阅模式。

观察者模式

一个简单场景:产品经理提新需求,搬砖侠勤奋搬砖

// Publisher  添加移出观察者,通知观察者干啥
class Publisher {
    observers = [];
    add(observer) {
        this.observers.push(observer);
    }
    remove(observer) {
        this.observers.splice(this.observers.findIndex(item => item === observer) >>> 0, 1);
    }
    // 通知所有的观察者给爷干活
    notify() {
        this.observers.forEach(observer => {
            observer.work(this);
        });
    }
}

// Observer
class Observer {
    work(publish) {
        console.log('接收到publish的指令');
    }
}

// 实例
class PM extends Publisher {
    prd = null;
    setPrd(prd) {
        this.prd = prd;
        // 产品经理搞好了prd就开始通知搬砖侠开始干活
        this.notify();
    }
    getPrd() {
        return this.prd;
    }
}

class BZX extends Observer {
    constructor(name) {
        super();
        this.name = name;
    }
    work(pm) {
        const prd = pm.getPrd();
        console.log(`${this.name}收到了你的prd: ${prd}, 别催了一会就干~`);
    }
}

// 测试:一个pm和三个搬砖侠的故事
let pm = new PM();

let bzx1 = new BZX('bzx1');
let bzx2 = new BZX('bzx2');
let bzx3 = new BZX('bzx3');

pm.add(bzx1);
pm.add(bzx2);
pm.add(bzx3);

pm.setPrd('给爷去搬砖!!!!');
// bzx1收到了你的prd: 给爷去搬砖!!!!, 别催了一会就干~
// bzx2收到了你的prd: 给爷去搬砖!!!!, 别催了一会就干~
// bzx3收到了你的prd: 给爷去搬砖!!!!, 别催了一会就干~

发布-订阅模式

用过 vue 的朋友应该很清楚,在 vue 中跨组件通信的方法有一种叫做 EventBus,是典型的发布-订阅模式。
简单实现一个发布-订阅。

class EventCenter {
    // 事件调度中心
    eventMap = {};
    // 监听; 事件名和对应的回调函数
    on(eventName, callback) {
        if (typeof callback !== 'function') {
            throw new Error('请设置正确的函数作为回调');
        }
        // 没有该eventName的事件队列就新建该队列
        if (!this.eventMap[eventName]) {
            this.eventMap[eventName] = [];
        }
        // 把callback放入队列
        this.eventMap[eventName].push(callback);
    }
    // 触发;
    emit(eventName, params) {
        if (this.eventMap[eventName]) {
            this.eventMap[eventName].forEach((callback, index) => {
                callback(params);
            });
        }
    }
    off(eventName, callback) {
        if (this.eventMap[eventName]) {
            this.eventMap[eventName].splice(this.eventMap[type].indexOf(callback) >>> 0, 1);
        }
    }
}

// 测试:简单的事件
handleTest = params => {
    console.log(`你好:${params.name}`);
};

const eventCenter = new EventCenter();

eventCenter.on('test', handleTest);
eventCenter.emit('test', { name: '94yk' });
// 输出:你好:94yk

差异

  • 在观察者模式中,观察者是知道发布者的,发布者一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者互相不知道对方的存在。它们通过调度中心进行通信。
  • 在发布订阅模式中,组件是松耦合的,正好和观察者模式相反。
  • 观察者模式大多数时候是同步的,比如当事件触发,发布者就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yokiizx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值