使用装饰器模式。
装饰器模式是一种结构型的设计模式,可用于扩展或修改对象的行为。在 Node.js 中,我们可以借助此模式以更优雅的方式避免控制器和服务中的代码重复。
下面是一个使用装饰器模式的示例:
class UserService {
async findById(id) {
// 省略具体实现
}
async createUser(user) {
// 省略具体实现
}
}
function UserController(userService) {
this.userService = userService;
}
UserController.prototype.findById = async function(req, res) {
const user = await this.userService.findById(req.params.id);
res.send(user);
};
UserController.prototype.createUser = async function(req, res) {
const user = await this.userService.createUser(req.body);
res.send(user);
};
const decorateUserController = function(userService) {
const userController = new UserController(userService);
userController.findById = async function(req, res) {
console.log('before findById...');
await UserController.prototype.findById.call(this, req, res);
console.log('after findById...');
};
userController.createUser = async function(req, res) {
console.log('before createUser...');
await UserController.prototype.createUser.call(this, req, res);
console.log('after createUser...');
};
return userController;
};
const userService = new UserService();
const userController = decorateUserController(userService);
在上述示例中,我们定义了一个 UserService
类和 UserController
类。UserService
类提供了两个方法:findById
和 createUser
。UserController
类引用了一个 UserService
实例,并将其作为参数进行构造。UserController
类的两个方法分别对应了 UserService
类的 findById
和 createUser
方法,并且在处理请求时需要使用 UserService
类的方法以获取或修改数据。
我们使用 decorateUserController
函数对 UserController
类进行装饰。该函数返回了一个新的 UserController
实例,包含了对原来两个方法的拓展:在执行原有的方法前后,分别添加了一些额外的代码。
通过装饰器模式,我们在不更改原有控制器和服务代码的情况下,扩展了其功能,避免了代码的重复。
上一篇:避免在空格处过早换行