代理模式
特点:代理可以在请求发到真正应答方之前,对请求做一些预处理,帮助减轻真正请求应答方的责任,有利于函数单一职责化,降低模块耦合性。根据预处理的动作分类可分为 保护代理(过滤不合法请求),虚拟代理(为请求选择适合的执行时间),缓存代理(在访问应答方之前先访问代理中的缓存)等及其变形。
实现思路:在真正接受请求的应答方之前加一层代理,负责对请求的预处理。
/* 代理模式
* B通过proxy向A请求 B.doSomethingToA( proxy );
*/
var A = function () {
doSomething: function ( args ) {
//...
}
}
var proxy = function () {
doSomething: function ( args ) {
// ...preprocessing
// proprocessor done, go to A
A.doSomething( args )
}
}
var B = function () {
doSomethingToA: function ( target ) {
var args;
target.doSomething( args );
}
}
示例:
//示例:图片预加载
/* myImage.jpg 要显示的图片 @myImage 相当于模板中的A */
var myImage = (function () {
var imgNode = document.createElement( 'img' );
document.body.appendChild( imageNode );
return {
setSrc: function ( src ) {
imgNode.src = src;
}
}
})();
var proxy = (function () {
var img = new Image;
img.onload = function () {
myImage.setSrc( this.src );
}
return {
setSrc: function ( src ) {
myImage.setSrc( 'loading.gif' );
img.src = src;
}
}
})();
proxy.setSrc( 'myImage.jpg' );
//示例:缓存代理
var fn = function () {
// do something..
}
var proxy = (function () {
var cache = {};
return function () {
var args = Array.prototype.join.call( arguments,',' );
if( args in cache ){
return cache[ args ];
}
return cache[ args ] = fn.apply( this, arguments );
}
})();
//扩展:缓存代理工厂
var prodA = function () {
//
}
var prodB = function () {
//
}
var prodC = function () {
//
}
var createProxyFactory = function ( fn ) { //传入fn参数来动态创建缓存代理
var cache = {};
return function () {
var args = Array.prototype.join.call( arguments,',' );
if( args in cache ){
return cache[ args ];
}
return cache[ args ] = fn.apply( this, arguments );
}
};
var proxyA = createProxyFactory( prodA );
var proxyB = createProxyFactory( prodB );
var proxyC = createProxyFactory( prodC );
proxyA();
proxyB();
proxyC();