从TJ大神源码中学习代理模式

我们知道koa中有个context对象,context表示请求的上下文。今天在看这段代码的时候,发现了tjgit自己写的一个代理模式,觉得不错,记录一下。

地址:[delegates源码]https://github.com/tj/node-delegates/blob/master/index.js

设计模式中的代理模式是什么意思呢?

代理可以简单理解为:

为其他对象提供一种代理以控制对这个对象的访问。

context其实是responserequest的代理,将两者的一些方法注册到context上,这样通过context就可以访问到请求的上下文。

看看源码:

function Delegator(proto, target) {
  // 这样写是为了兼容直接调用delegate(proto, 'response')
  // 这样也能返回一个对象
  if (!(this instanceof Delegator)) return new Delegator(proto, target);

  // 工厂模式注册各种方法
  this.proto = proto;
  this.target = target;
  this.methods = [];
  this.getters = [];
  this.setters = [];
  this.fluents = [];
}

method方法

Delegator.prototype.method = function(name){
  var proto = this.proto;
  var target = this.target;
  this.methods.push(name);

  proto[name] = function(){
    // 通过apply将this绑定到原对象,使用当前参数
    return this[target][name].apply(this[target], arguments);
  };

  return this;
};

getter和setter:


Delegator.prototype.getter = function(name){
  var proto = this.proto;
  var target = this.target;
  this.getters.push(name);

  proto.__defineGetter__(name, function(){
    return this[target][name];
  });

  return this;
};

Delegator.prototype.setter = function(name){
  var proto = this.proto;
  var target = this.target;
  this.setters.push(name);

  proto.__defineSetter__(name, function(val){
    return this[target][name] = val;
  });

  return this;
};

用法:


delegate(proto, 'response')
  .method('attachment')
  .method('redirect')
  .method('remove')
  .method('vary')
  .method('set')
  .method('append')
  .method('flushHeaders')

tj代码,就是程序员的教科书。

你可能感兴趣的:(从TJ大神源码中学习代理模式)