发布订阅
什么是发布订阅
发布订阅模式事一种常见的设计模式,由三部分组成:发布者(Publisher)、调度中心(Event
Channel)、订阅者(Subscriber)。
订阅者讲想要订阅的时间注册到调度中心,当发布者发布该事件到调度中心,也就是改事件触发是,有调度中心统一调度订阅者注册到调度中心的处理代码。
手写发布订阅
const eventHub = {
events: {},
// 因为函数里面需要用到this,所以不要使用箭头函数
on(name, fn) {
this.events[name] = this.events[name] || [];
this.events[name].push(fn);
},
emit(name, data) {
const fns = this.event[name];
if(!fns) return;
fns.forEach(fn => {
fn.call(undefined, data);
});
},
off(name, fn) {
const fns = this.events[name];
const index = fns.indexOf(fn);
if(index > -1) {
this.events.splice(index, 1);
}
}
}
观察者模式
一个对象(称为subject)维持一系列以来与他的对象(称为observer),将有关状态的任何变更自动t通知给他们(观察者)
区别
设计模式 | 观察者模式 | 发布订阅者模式 |
---|---|---|
主体 | Object观察者、Subject目标对象 | Publisher发布者、EventChannel事件中心、Subscribe订阅者 |
主体关系 | Subject中通过ObserverList记录Observer | Publisher和Subscribe互相不知道对方,荣国中介联系 |
优点 | 角色明确,Subject和Object要遵循约定的成员方法 | 松散耦合、灵活度高、通常应用在异步编程中 |
缺点 | 紧耦合 | 当事件类型变多时,会增加维护成本 |
使用案例 | 双向数据绑定 | 事件总线EventBus |