Skip to content
0

NodeJs 设计模式

模块模式

由于 NodeJs 不像其他语言一样,例如 Java,支持属性私有化。通过这种模式,可以模拟类似的功能

const counter = require('./counter');

counter.increment();
counter.increment();

console.log(counter.get()); // 2

counter.decrement();

console.log(counter.get()); // 1
let 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);

Released under the MIT License.