本文详细介绍 Node.js 开发中常用的四种设计模式。通过具体代码示例,解析单例模式如何确保类仅有一个实例;适配器模式如何转换接口以兼容不同模块;装饰器模式如何在不修改基类的前提下扩展功能;以及观察者模式如何实现事件通知机制。适合希望提升 Node.js 代码架构能力的开发者参考。
Node.js 设计模式概述
本文通过具体实例介绍 Node.js 中的设计模式应用,旨在为开发者提供可参考的实践方案。
单例模式
1. 单例模式
单例模式的核心在于确保一个类在整个应用程序生命周期中仅存在一个实例。其实现逻辑是:在请求创建对象时,先检查该实例是否已存在;若存在则直接返回现有对象;若不存在,则创建新实例并将其存储在静态变量中,以便后续请求直接复用。例如,学校建设图书馆的过程:当第一位学生请求建立图书馆时,由于尚未存在,领导会创建一个新的图书馆实例;当后续学生再次请求时,由于图书馆已存在,领导会直接指引其使用已有的图书馆,从而避免了重复建设。
/*singleInstance.js*/
var _instance = null;//定义初始化_instance
module.exports = function(time){
function Car(time){
this.time = time;
}
this.getInstance = function(){
if(_instance != null){
return _instance;
}else{
return new Car(time);
}
}
}
适配器模式
2. 适配器模式
适配器模式用于将一个类的接口转换为客户期望的另一个接口,从而解决接口不兼容导致无法协同工作的问题。以小明为父亲大明替换白酒为例:小明将白酒瓶中的酒倒掉并注入白开水(重写内部实现),但保留了原有的酒瓶外观(接口不变)。大明不知情地饮用后感到满意,这表明适配器在不改变外部接口的情况下,通过修改内部逻辑实现了功能转换,是一种兼顾兼容性与目的性的设计手段。
/*target.js*/
module.exports = function(){
this.request = function(){//原接口
console.log('Target::request');
}
}
/*adapter.js*/
var util = require('util');
var Target = require('./target.js');
var Adaptee = require('./adaptee.js');
function Adapter(){
Target.call(this);
this.request = function(){//重写原接口
var adapteeObj = new Adaptee();//重写的内容
adapteeObj.specialRequest();
}
}
util.inherits(Adapter, Target);//通过继承原模块, 获得原接口
module.exports = Adapter;
装饰模式
3. 装饰模式
装饰模式利用继承机制,在不修改基类源代码的前提下,动态地为对象扩展功能。以装饰圣诞树为例:初始状态为一棵裸树(基类)。Amy 通过往树上挂饰品来扩展其功能;随后 Billy 继承这棵树,并继续添加其他饰品进行二次扩展。这种方式允许通过层层继承和组合,灵活地增加对象的行为。
/*Base.js*/
module.exports = function(){
this.dosomething = function(){
console.log("Nice to meet u.");
}
}
/*Decorator.js*/
var util = require("util);
var Base = require('./Base');
function Decorator(){
Base.call(this);
this.dosomething = function(){
Base.dosomething();
console.log('I am a decorator');//拓展内容
}
}
util.inherits(Decorator, Base);//继承
module.exports = Decorator;
观察者模式
4. 观察者模式
观察者模式定义了对象间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会收到通知并做出响应。以校园情感故事为例:小狗和小熊同时关注小兔的动态。此时,小狗和小熊作为“观察者”,订阅了小兔(“被观察者”)的状态。当小兔发生特定行为(如执行某个函数)时,会触发通知机制,同时告知所有注册的观察者,并调用它们各自的回调函数以执行相应的反馈逻辑。
/*被观察者*/
module.exports = function(){
var m_obserSet = [];//观察者列表
var _self = this;
this.addObser = function(observer){
m_obserSet.push(observer);//添加观察者
}
this.doAction = function(){
console.log("Observable do some action");
_self.notifyAllObeser();
}
this.notifyAllObeser = function(){//发生动作
for(var key in m_obserSet){//逐个通知观察者
m_obserSet[key].update();//观察者执行回调
}
}
}
希望上述关于 Node.js 设计模式的解析与代码示例,能对读者的程序设计工作提供有益帮助。