基本概念
定义:为一个对象提供一个代用品或占位符,以便控制对它的访问
场景:权限控制(保护代理)、延迟加载(虚拟代理)、缓存代理
代理的意义:维护单一职责原则
代理和本体接口应该有一致性,这样的好处是:
- 用户可以放心地请求代理,他只关系是否能够得到想要的结果
- 在任何使用本体的地方都可以替换成使用代理
虚拟代理的代码实现
jscode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
var myImage = (function(){ var imgNode = document.createElement( 'img' ); document.body.appendChild( imgNode ); return function( src ){ imgNode.src = src; } })();
var proxyImage = (function(){ var img = new Image; img.onload = function(){ myImage( this.src ); } return function( src ){ myImage( 'file:// /C:/Users/svenzeng/Desktop/loading.gif' ); img.src = src; } })();
proxyImage( 'http:// imgcache.qq.com/music// N/k/000GGDys0yA0Nk.jpg' );
|
缓存代理的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| var mult = function() { var a = 1 for ( var i =0; i < arguments.length; i++ ) { a = a * arguments[i] } return a }
var plus = function() { var a = 0 for ( var i =0; i < arguments.length; i++ ) { a = a + arguments[i] } return a }
var createProxyFactory = function( 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 proxyMult = createProxyFactory( mult ), proxyPlus = createProxyFactory( plus )
|