18.什么是发布订阅模式,写出其核心实现代码?
时间: 2024-03-08 20:46:13 浏览: 23
发布订阅模式是一种常用的设计模式,它允许我们定义对象间的一种一对多的依赖关系,当对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。发布订阅模式的核心在于发布者和订阅者之间的解耦,发布者不需要知道订阅者的存在,订阅者也不需要知道发布者的存在,它们只需要知道消息的名称或者类型即可。
以下是发布订阅模式的核心实现代码:
```
class EventEmitter {
constructor() {
this.events = {};
}
on(eventName, listener) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(listener);
}
emit(eventName, ...args) {
if (this.events[eventName]) {
this.events[eventName].forEach(listener => listener.apply(null, args));
}
}
off(eventName, listener) {
if (this.events[eventName]) {
this.events[eventName] = this.events[eventName].filter(l => l !== listener);
}
}
once(eventName, listener) {
const onceListener = (...args) => {
this.off(eventName, onceListener);
listener.apply(null, args);
};
this.on(eventName, onceListener);
}
}
```
以上代码实现了一个简单的EventEmitter类,它包含了四个方法:on、emit、off和once。其中,on方法用于订阅事件,emit方法用于发布事件,off方法用于取消订阅事件,once方法用于订阅一次性事件。
使用示例:
```
const eventEmitter = new EventEmitter();
// 订阅事件
eventEmitter.on('click', e => console.log(`clicked: ${e}`));
eventEmitter.on('hover', e => console.log(`hovered: ${e}`));
// 发布事件
eventEmitter.emit('click', 'button');
eventEmitter.emit('hover', 'link');
// 取消订阅事件
const clickHandler = e => console.log(`clicked: ${e}`);
eventEmitter.on('click', clickHandler);
eventEmitter.off('click', clickHandler);
// 订阅一次性事件
eventEmitter.once('load', () => console.log('loaded'));
eventEmitter.emit('load');
eventEmitter.emit('load'); // 不会触发事件
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)