代理模式缓存
特色:代理能够在请求发到真正应答方以前,对请求作一些预处理,帮助减轻真正请求应答方的责任,有利于函数单一职责化,下降模块耦合性。根据预处理的动做分类可分为 保护代理(过滤不合法请求),虚拟代理(为请求选择适合的执行时间),缓存代理(在访问应答方以前先访问代理中的缓存)等及其变形。app
实现思路:在真正接受请求的应答方以前加一层代理,负责对请求的预处理。函数
/* 代理模式 * 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 ); } }
示例:this
//示例:图片预加载 /* 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();