前端面试不用愁:发布-订阅和观察者模式的区别

发布-订阅模式和观察者模式是两种常用的设计模式,它们在概念上非常相似,但在实现细节和用途上有一些区别。

观察者模式:
观察者模式是一种对象行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。在这种模式中,通常有两个主要角色:主题(Subject)和观察者(Observer)。主题维护一个观察者列表,当主题状态发生变化时,它会遍历这个列表并通知每个观察者。

发布-订阅模式:
发布-订阅模式是观察者模式的一种变体,它允许对象(称为订阅者)向另一个对象(称为发布者)订阅事件,并在事件发生时接收通知。与观察者模式不同,发布-订阅模式中的发布者和订阅者之间不直接交互,而是通过一个中介(通常是一个事件通道或消息队列)来进行通信。发布者将事件发送到中介,而订阅者则监听这些事件并做出相应的处理。

以下是一个简单的代码示例,展示了观察者模式和发布-订阅模式的区别:

观察者模式的代码示例:

class Subject {
  constructor() {
    this.observers = [];
  }

  addObserver(observer) {
    this.observers.push(observer);
  }

  removeObserver(observer) {
    const index = this.observers.indexOf(observer);
    if (index > -1) {
      this.observers.splice(index, 1);
    }
  }

  notifyObservers(message) {
    for (let observer of this.observers) {
      observer.update(message);
    }
  }
}

class Observer {
  update(message) {
    console.log('Observer received message:', message);
  }
}

const subject = new Subject();
const observer = new Observer();
subject.addObserver(observer);

// 当主题状态发生变化时,通知观察者
subject.notifyObservers('Hello, observer!');

发布-订阅模式的代码示例:

class EventEmitter {
  constructor() {
    this.events = {};
  }

  on(event, listener) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(listener);
  }

  off(event, listener) {
    const index = this.events[event] ? this.events[event].indexOf(listener) : -1;
    if (index > -1) {
      this.events[event].splice(index, 1);
    }
  }

  emit(event, ...args) {
    if (this.events[event]) {
      this.events[event].forEach(listener => listener(...args));
    }
  }
}

const eventEmitter = new EventEmitter();
const subscriber = (message) => console.log('Subscriber received message:', message);

eventEmitter.on('greeting', subscriber);

// 发布事件,通知订阅者
eventEmitter.emit('greeting', 'Hello, subscriber!');

总结:

  • 观察者模式中,主题直接管理观察者的列表,并在状态变化时通知它们。
  • 发布-订阅模式中,发布者和订阅者之间通过一个中介(如事件通道)进行解耦,使得它们不需要直接交互。
  • 在这里插入图片描述
    前私信【学习】即可获取更多前端资料!!!

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_44714345/article/details/138155456

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值