Notes

装饰器模式

示例代码,模拟创建简单的服务器程序

// 调用方法
var nodeServer = new BasicServer();
nodeServer = nodeServer.decorate('serveNode'); // 使用装饰器
nodeServer = nodeServer.decorate('decorateIt');
nodeServer = nodeServer.decorate('3000');
nodeServer.init(); // 初始化服务器

// 实现服务器
function BasicServer() {
    // 服务器的基本配置
    this.pid = 1;
    this.decoratorsList = [];
}
// 创建承载装饰器的对象
BasicServer.decorators = {};

// 定义装饰器
BasicServer.decorators.serveNode = {
    init: function() {
        // ...
    },
};

BasicServer.decorators.decorateIt = {
    init: function() {
        // ...
    },
};

// 调用 decorate 时,将装饰器加入到列表
BasicServer.prototype.decorate = function(decorator) {
    this.decoratorsList.push(decorator);
};

// 调用 init 方法,将依次调用装饰器的 init 方法,这算是一种协议
BasicServer.prototype.init = function() {
    var runningProcesses = null;
    var pid = this.pid;
    for (var i = 0; i < this.decoratorsList.length; i++) {
        decoratorName = this.decoratorsList[i];
        BasicServer.decorators[decoratorName].init();
    }
}:

Notes:

  1. BasicServer.decorate() 用来记录需要用到的装饰器
  2. BasicServer.init() 用来一次执行每一个装饰器中实现的协议方法
  3. BasicServer.init() 与装饰器需要协定一个方法,这个方法保证了装饰器生效