观察者模式、中介者模式和发布订阅模式 |
您所在的位置:网站首页 › 发布者订阅者模式 › 观察者模式、中介者模式和发布订阅模式 |
观察者模式
定义
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新 观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯 例如生活中,我们可以用报纸期刊的订阅来形象的说明,当你订阅了一份报纸,每天都会有一份最新的报纸送到你手上,有多少人订阅报纸,报社就会发多少份报纸 报社和订报纸的客户就形成了一对多的依赖关系 灵感来源于:addEventListener DOM2事件绑定 给当前元素的某一个事件行为,绑定多个不同的方法「事件池机制」事件行为触发,会依次通知事件池中的方法执行支持内置事件{标准事件,例如:click、dblclick、mouseenter…}应用场景:凡是某个阶段到达的时候,需要执行很多方法「更多时候,到底执行多少个方法不确定,需要编写业务边处理的」,我们都可以基于发布订阅设计模式来管理代码;创建事件池->发布计划 向事件池中加入方法->向计划表中订阅任务 fire->通知计划表中的任务执行 let sub = (function () { let pond = {}; // 向事件池中追加指定自定义事件类型的方法 const on = function on(type, func) { // 每一次增加的时候,验证当前类型在事件池中是否已经存在 !Array.isArray(pond[type]) ? pond[type] = [] : null; let arr = pond[type]; if (arr.includes(func)) return; arr.push(func); }; // 从事件池中移除指定自定义事件类型的方法 const off = function off(type, func) { let arr = pond[type], i = 0, item = null; if (!Array.isArray(arr)) throw new TypeError(`${type} 自定义事件在事件池中并不存在!`); for (; i console.log(2); const fn3 = () => { console.log(3); sub.off('A', fn1); sub.off('A', fn2); }; const fn4 = () => console.log(4); const fn5 = () => console.log(5); const fn6 = () => console.log(6); sub.on('A', fn1); sub.on('A', fn2); sub.on('A', fn3); sub.on('A', fn4); sub.on('A', fn5); sub.on('A', fn6); setTimeout(() => { sub.emit('A'); }, 1000); setTimeout(() => { sub.emit('A'); }, 2000); 观察者模式和发布订阅模式的区别观察者模式:某公司给自己员工发月饼发粽子,是由公司的行政部门发送的,这件事不适合交给第三方,原因是“公司”和“员工”是一个整体 发布-订阅模式:某公司要给其他人发各种快递,因为“公司”和“其他人”是独立的,其唯一的桥梁是“快递”,所以这件事适合交给第三方快递公司解决 上述过程中,如果公司自己去管理快递的配送,那公司就会变成一个快递公司,业务繁杂难以管理,影响公司自身的主营业务,因此使用何种模式需要考虑什么情况两者是需要耦合的 在观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。 观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |