订阅发布模式
Subscriber
- 概述
- 和观察者一样,包括:观察者和观察目标
- 观察者模式下,两者互相知道,如要添加观察目标,并没有完全解耦
- 可以细分管控:区分订阅
- 订阅发布者模式下,发布者只管发布,谁订阅了,它不知道
- 通过第三方集中调度,相当于解耦的观察者模式
- 应用
- 面包屑
- 参考代码
-
Subscriber:以方法test1、test2代替类的方法 const Center = { message: {}, publich(type, data) { if (!this.message[type]) return; this.message[type].forEach(item => item(data)) }, subscribe(type, cb) { if (!this.message[type]) { this.message[type] = [cb] } else { this.message[type].push(cb) } }, unSubscribe(type, cb) { if (!this.message[type]) return; this.message = this.message[type].filter(item => item != cb) } } function test1(data) { console.log('test1', data); } function test2(data) { console.log('test2', data); }
-
Usage Center.subscribe('a', test1) Center.subscribe('b', test2) Center.subscribe('b', test1) Center.publich('a', 111) Center.publich('b', 222)
- 面包屑
-
Subscriber const Center = { message: {}, publich(type, data) { if (!this.message[type]) return; this.message[type].forEach(item => item(data)) }, subscribe(type, cb) { if (!this.message[type]) { this.message[type] = [cb] } else { this.message[type].push(cb) } }, unSubscribe(type, cb) { if (!this.message[type]) return; this.message = this.message[type].filter(item => item != cb) } } Center.subscribe('updateDOM', data => { document.querySelector('#bread').innerHTML = data }) news.addEventListener('click', (e) => { if (e.target.tagName == 'LI') { Center.publich('updateDOM', e.target.innerHTML) } })