观察者模式通过定义被观察者与观察者的依赖关系,实现状态变化时的自动通知机制,适用于事件驱动场景如ui更新、消息推送等,其核心是解耦与广播通知,需注意及时移除观察者以避免内存泄漏,最终确保系统灵活性与可维护性。

观察者模式是一种行为设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。这种机制常被称为“事件通知机制”,非常适合实现松耦合的组件通信。
下面通过一个简单的例子来说明如何编写观察者模式的事件通知机制。
观察者模式包含两个主要角色:
// 1. 定义观察者接口(抽象)
class Observer {
update(message) {
// 子类实现
}
}
// 2. 被观察者(主题)
class Subject {
constructor() {
this.observers = []; // 存储观察者
}
// 添加观察者
addObserver(observer) {
if (observer.update) {
this.observers.push(observer);
}
}
// 移除观察者
removeObserver(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
// 通知所有观察者
notify(data) {
this.observers.forEach(observer => {
observer.update(data);
});
}
}假设我们有一个“新闻订阅系统”,用户是观察者,新闻发布是被观察者。
// 具体观察者:用户
class User extends Observer {
constructor(name) {
super();
this.name = name;
}
update(message) {
console.log(`${this.name} 收到通知:${message}`);
}
}
// 创建被观察者
const newsAgency = new Subject();
// 创建观察者
const user1 = new User('张三');
const user2 = new User('李四');
// 注册观察者
newsAgency.addObserver(user1);
newsAgency.addObserver(user2);
// 发布新闻,触发通知
newsAgency.notify('今日天气晴朗,适合出行!');
// 输出:
// 张三 收到通知:今日天气晴朗,适合出行!
// 李四 收到通知:今日天气晴朗,适合出行!为了更灵活地支持多种事件类型,可以对机制进行扩展:
class EventCenter {
constructor() {
this.events = {}; // 按事件名存储观察者
}
on(event, callback) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(callback);
}
emit(event, data) {
if (this.events[event]) {
this.events[event].forEach(callback => callback(data));
}
}
off(event, callback) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(cb => cb !== callback);
}
}
}
// 使用
const bus = new EventCenter();
bus.on('news', msg => console.log('新闻:' + msg));
bus.on('weather', info => console.log('天气:' + info));
bus.emit('news', '全球AI大会召开');
bus.emit('weather', '明天有雨');基本上就这些。观察者模式的关键是解耦和自动通知,通过统一接口让变化传播更可控。实现不复杂,但容易忽略移除观察者导致内存泄漏,记得在适当时机清理订阅。
以上就是观察者模式怎样编写 事件通知机制实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号