NodeJS设计模式总结
本文总结了 NodeJS 中常用的设计模式,包括:
- 单例模式
- 适配器模式
- 装饰模式
- 观察者模式
单例模式
单例模式保证一个类只有一个实例,并提供一个全局的访问入口。
在 NodeJS 中实现单例模式可以通过 module.exports
将类的实例赋值给一个变量,这个变量就成为了全局的访问入口。
示例代码:
// Singleton.js
class Singleton {
constructor() {
this.id = Math.random();
}
static getInstance() {
if (!this.instance) {
this.instance = new Singleton();
}
return this.instance;
}
}
module.exports = Singleton.getInstance(); // 将类的实例赋值给变量
在其他文件中引入 Singleton,可以获得同一个实例:
// test.js
const Singleton = require('./Singleton');
console.log(Singleton.id); //每次打印都会得到相同的随机数
适配器模式
适配器模式将一个接口转换成另一个接口,使得原本不兼容的类能够在一起工作。在 NodeJS 中常用的场景是将老代码接入新代码中,或者将不同第三方库中的接口统一。
示例代码:
// 旧的代码库中的接口
class OldAPI {
getName() {
return 'old API name';
}
}
// 统一了不同的 API 接口
class Adapter {
constructor() {
this.newAPI = new NewAPI();
}
getName() {
return this.newAPI.getUserName();
}
}
// 新的代码库中的接口
class NewAPI {
getUserName() {
return 'new API name';
}
}
const adapter = new Adapter();
console.log(adapter.getName()); // new API name
这里通过适配器模式将不同的 API 接口转换成了统一的接口。在 Adapter
类中,实例化了 NewAPI
并将其包装成了一个新的接口,将这个接口与旧代码库中的接口进行了统一,通过 adapter.getName()
调用时,会返回新 API 中的名称。
装饰模式
装饰模式在不改变一个对象的基础上,动态地给对象添加新的功能。在 NodeJS 中常用的场景是对已有的函数或服务进行扩展或包装。
示例代码:
// 原始服务
function service() {
return 'service';
}
// 装饰器,扩展原始服务功能
function decorator(originalFunction) {
return function() {
const result = originalFunction.call(this, ...arguments);
return `${result} + decorator`;
};
}
const decoratedService = decorator(service);
console.log(decoratedService()); // service + decorator
这里通过装饰器扩展了原始服务的功能,在原基础上添加了一个后缀。
观察者模式
观察者模式指的是对象间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
在 NodeJS 中常用事件模型实现观察者模式,事件触发者相当于被观察者,事件监听者则相当于观察者。
示例代码:
// 观察者类
class Observer {
constructor(name) {
this.name = name;
}
update(message) {
console.log(`${this.name} has received message: ${message}`);
}
}
// 观察目标类
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) { // 添加观察者
this.observers.push(observer);
}
removeObserver(observer) { // 删除观察者
const index = this.observers.indexOf(observer);
this.observers.splice(index, 1);
}
notifyObservers(message) { // 通知观察者
this.observers.forEach(observer => observer.update(message));
}
}
const subject = new Subject();
const observer1 = new Observer('Observer-1');
const observer2 = new Observer('Observer-2');
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notifyObservers('Hello world!'); // Observer-1 has received message: Hello world!
// Observer-2 has received message: Hello world!
在这个示例中,Observer
类表示观察者,Subject
类表示被观察者。Subject
类中维护了一个 observers
数组,存储所有观察者。addObserver
和 removeObserver
方法用于添加或删除观察者。notifyObservers
方法用于通知所有的观察者,并将消息传入观察者的 update
方法中,在这个方法中观察者完成响应动作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】 - Python技术站