观察者模式
观察者模式包罗观察目的和观察者两类对象。一个目的可以有任意数目的与之相依靠的观察者。一旦观察目的的状态发生改变,全部的观察者都将得到关照。
当一个对象的状态发生改变时,全部依靠于它的对象都得到关照并被自动更新,解决了主体对象与观察者之间功能的耦合,即一个对象状态改变给其他对象关照的问题。
- class Subject {
- constructor() {
- this.observers = []
- }
- add(observer) {
- this.observers.push(observer)
- }
- remove(observe) {
- this.observers = this.observers.filter(observer => observer !== observe)
- }
- notify() {
- this.observers.forEach(observer => {
- observer.update()
- })
- }
- }
- class Observer {
- constructor(name) {
- this.name = name
- }
- update() {
- console.log(this.name, 'update')
- }
- }
- const subject = new Subject();
- const observer1 = new Observer('liu');
- const observer2 = new Observer('hao')
- subject.add(observer1)
- subject.add(observer2)
- subject.notify() // liu update hao update
复制代码 前端通常的应用是导航和面包屑,面包屑发生改变,对应的页面内容也会发生改变。
优势:目的者与观察者,功能耦合度降低,专注自身功能逻辑;观察者被动接收更新,时间上解耦,实时接收目的者更新状态。
缺点:观察者模式虽然实现了对象间依靠关系的低耦合,但却不能对事件关照举行细分管控,如“筛选关照”,“指定主题事件关照”。
订阅发布模式
- 观察者和目的要相互知道
- 发布者和订阅者不消互相知道,通过第三方实现调理,属于颠末解耦合的观察者模式
- // 发布订阅模式
- class PubSub {
- constructor() {
- this.subscribers = {};
- }
- subscribe(type, callback) {
- if (!this.subscribers[type]) {
- this.subscribers[type] = [];
- }
- this.subscribers[type].push(callback);
- }
- publish(type, ...args) {
- if (this.subscribers[type]) {
- this.subscribers[type].forEach(callback => {
- callback(...args);
- });
- }
- }
- unsubscribe(type, callback) {
- if (this.subscribers[type]) {
- this.subscribers[type] = this.subscribers[type].filter(cb => cb !== callback);
- }
- }
- }
- function eventA() {
- console.log('eventA');
- }
- function testB() {
- console.log('testB');
- }
- const pubSub = new PubSub();
- pubSub.subscribe('eventA', eventA);
- pubSub.subscribe('testB', testB);
- pubSub.publish('eventA');
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |