发布订阅模式的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class EventEmitter { constructor(){ this.events={}; } on(type,handler){ if(!this.events[type]){ this.events[type]=[] } this.events[type].push(handler) } addListener(type,handler){ this.on(type,handler) } prependListener(type,handler){ if(!this.events[type]){ this.events[type]=[] } this.events[type].unshift(handler) } removeListener(type,handler){ if(!this.events[type]){ return; } this.events[type]=this.events[type].filter(item=>item !== handler) } off(type,handler){ this.removeListener(type,handler) } emit(type,...args){ if(!events[type]||events[type].length==0){ return; } this.events[type].forEach(item=>{ Reflect.apply(item,this,args); }) } once(type,handler){ function temp(...args){ handler(args) this.off(type,handler) } this.on(type,temp) } }
|
优点:
- 时间解耦
- 对象之间解耦
- 应用上:可以用在异步编程
- 架构上:MVC和MVVM都有发布订阅模式的参与,JavaScript本身是一门基于事件驱动的语言
缺点:
创建订阅者本身需要消耗一定的时间和内存,而且当你订阅一个消息后,如果该消息最后都未发生,那么这个订阅者会始终存储在内存中。另外,发布订阅模式虽然会弱化对向之间的联系,但是过度使用,,对象和对象之间的必要联系会被深埋在背后,导致程序难以维护和理解