观察者模式通过Subject维护Observer列表并直接通知更新,Pub/Sub则借助事件总线实现完全解耦的事件通信;二者在耦合度、通信方式、生命周期管理和适用场景上存在本质区别。

观察者模式(Observer Pattern)是一种行为型设计模式,核心是让一个对象(被观察者/Subject)维护一组依赖它的对象(观察者/Observer),当被观察者状态变化时,自动通知所有观察者更新。
基础实现如下:
被观察者(Subject)
class Subject {
constructor() {
this.observers = [];
}
// 添加观察者
addObserver(observer) {
if (typeof observer.update === 'function') {
this.observers.push(observer);
}
}
// 移除观察者
removeObserver(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
// 通知所有观察者
notify(data) {
this.observers.forEach(observer => observer.update(data));
}
}
观察者(Observer)
立即学习“Java免费学习笔记(深入)”;
class Observer {
constructor(name) {
this.name = name;
}
update(data) {
console.log(`${this.name} 收到更新:`, data);
}
}
使用示例:
const subject = new Subject();
const o1 = new Observer('UI组件');
const o2 = new Observer('日志服务');
subject.addObserver(o1);
subject.addObserver(o2);
subject.notify({ status: 'loading' }); // 两者都会收到
发布-订阅是观察者模式的松耦合变体:不直接持有观察者引用,而是通过一个中间调度中心(事件总线)进行消息分发。发布者和订阅者完全解耦,甚至无需知道彼此存在。
简易事件总线实现:
class EventBus {
constructor() {
this.events = {};
}
// 订阅事件
on(event, callback) {
if (!this.events[event]) this.events[event] = [];
this.events[event].push(callback);
}
// 发布事件
emit(event, data) {
const callbacks = this.events[event];
if (callbacks && callbacks.length) {
callbacks.forEach(cb => cb(data));
}
}
// 取消订阅
off(event, callback) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(cb => cb !== callback);
}
}
}
// 使用
const bus = new EventBus();
bus.on('user:login', (user) => console.log('欢迎', user.name));
bus.on('user:logout', () => console.log('已登出'));
bus.emit('user:login', { name: '张三' });
module:eventName)。以上就是javascript如何实现观察者模式_与发布订阅有何区别的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号