PublishSubScribe(发布订阅)模式
前⾔
上⼀篇⽂章中,我们讲了如何, 本篇⽂章将带来Publish/SubScribe模式,并且利⽤该模式实现⼀个简易的消息通知功能,⽂章的最后还与Oberver进⾏对⽐。
什么是发布者/订阅模式?
Publish/Subscribe模式使⽤了⼀个主题/ 事件通道,这个通道介于希望接收到通知的对象(订阅者)和激活事件的对象之间(发布者)。
实现手机处理器哪个好
class Pubsub {
constructor() {妈祖文化
this.subUid = -1;
}
// 发布或者⼴播事件
publish = function (topic, args) {
芋螺毒素>什么是英语语法
if (!pics[topic]) {
return fal;
}
let subscribe = pics[topic];
let len = subscribe ? subscribe.length : 0;
while (len--) {
subscribe[len].func(topic, args);
}
};
// 通过特定的名称和回调函数订阅事件
subscribe = function (topic, func) {
if (!pics[topic]) {
}
蚕丝被品牌
let token = (++this.subUid).toString();
token,
func,
});
玉器雕刻
return token;
};
// 基于订阅上的标记引⽤,通过特定的topic进⾏取消订阅
unsubscribe = function (token) {
for (let m pics) {
if (pics[m]) {
for (let i = 0; i < pics[m].length; i++) {
if (pics[m][i].token === token) {
return token;
}
}
}
}
return this;
};
}
优点
Obrver模式和Publish/Subscribe模式⿎励我们努⼒思考应⽤程序不同部分之间的关系,可以⽤于将应⽤程序分解更⼩、更松散耦合的块,以改进代码管理和潜在的复⽤。
吮吸在使⽤任何⼀种模式时,动态关系可以在观察者和⽬标之间存在。提供了很⼤的灵活性,当应⽤程序的不同部分紧密耦合时,这不是很容易实现的。
缺点
从订阅者中解耦发布者,它有时会很难保证应⽤程序的特定部分按照我们期望的运⾏。
订阅者⾮常⽆视彼此的存在,并对变换发布者产⽣的成本视⽽不见。由于订阅者和发布者之间的动态关系,很难跟踪以来更新。
应⽤
利⽤Publish/Subscribe模式,实现⼀个简单的消息通知功能。数学题怎么做
let pubsub = new Pubsub();
// 简单的消息记录器所有通过订阅者接收到的主题和数据
let messageLogger = function (topics, data) {
console.log(topics, data);
};
// 订阅者监听订阅的topic,⼀旦topic进⾏⼴播,订阅者就调⽤回调函数
let subscription = pubsub.subscribe('inbox/newMessage', messageLogger);
// 发布者负责发布程序感兴趣的topic 或者通知
pubsub.publish('inbox/newMessage', 'hello word');
//
pubsub.publish('inbox/newMessage', ['test', 'a', 'b', 'c']);
// 这⾥取消订阅
pubsub.unsubscribe(subscription);
// 因为这⾥取消了订阅,所以后续没法通知到订阅者
pubsub.publish('inbox/newMessage', {
nder: '',
body: 'hey~',
});
Obrver(观察者)模式和Publish/SubScribe(发布/订阅)模式的区别
Obrver模式要求希望接收到主题通知的观察者必须订阅内容改变的事件。
Publish/SubScribe模式允许任何订阅者执⾏适当的事件处理程序来注册和接收发布者发出的通知。
很多⼈认为,Obrver模式和Publish/Subscribe模式是⼀样的,其实他们还是有很多不同的,他们两者的区别就跟之前是快递员上门送货,后来快递太多了,为了增加效率,分⼯更明确⼀点,现在多了个中间站,菜鸟驿站,快递员⽅便了,这是在规模起来以后⾃然⽽然的选择。现在是⼈主动去拿快递,如果以后连这也嫌弃效率不⾼,怎么办?再加⼀层,菜鸟驿站派出机器⼈送。