NodeJs 设计模式
模块模式
由于 NodeJs 不像其他语言一样,例如 Java,支持属性私有化。通过这种模式,可以模拟类似的功能
const counter = require('./counter');
counter.increment();
counter.increment();
console.log(counter.get()); // 2
counter.decrement();
console.log(counter.get()); // 1let count = 0;
const increment = () => {
count++;
}
const decrement = () => {
count--;
}
const get = () => {
return count;
}
module.exports = {
increment,
decrement,
get
};装饰器模式
装饰器模式就是向对象添加新功能,而不影响其他的实例
class Car {
constructor() {
this.price = 10000;
}
getPrice() {
return this.price;
}
}
class CarOptions {
constructor(car) {
this.car = car;
}
addGPS() {
this.car.price += 500;
}
addRims() {
this.car.price += 300;
}
}
const basicCar = new Car();
console.log(basicCar.getPrice()); // 10000
const carWithOptions = new CarOptions(basicCar);
carWithOptions.addGPS();
carWithOptions.addRims();
console.log(carWithOptions.car.getPrice()); // 10800上面通过 CarOptions 类,扩展了 basicCar 对象的一些方法。TS 的 decorator 也是如此思想
依赖注入模式
所谓依赖注入模式,就是一个模块/Class,接受来自外部资源的模块,而不是在内部创建它们。然后通过内部的逻辑,组合外部的模块
好处是便于解耦,测试,重用
// service.js
class Service {
constructor(db, logger) {
this.db = db;
this.logger = logger;
}
async getUser(userId) {
const user = await this.db.findUserById(userId);
this.logger.log(`Fetched user ${user.name}`);
return user;
}
}
// app.js
const Database = require('./database');
const Logger = require('./logger');
const db = new Database();
const logger = new Logger();
const service = new Service(db, logger);
service.getUser(1);