zoukankan      html  css  js  c++  java
  • 设计模式之代理模式与观察者模式

    代理模式

    代理模式-将操作交由代理来实现,代理上会有其他的处理,使之在适当的时候才去操作
    虚拟代理-开销大之类的操作,用异步的方式(延迟)代理去实现
    
        //虚拟代理之延迟处理功能
    	var getInput = function (type) {
    		if(type === "all") return document.getElementsByTagName('input');
    		if(typeof type === "number") return document.getElementsByTagName('input')[type-1];
    		if(Object.prototype.toString.call(type) == '[object Array]'){
    			var inputArr = [];
    			for(var i in type){
    				var input = document.getElementsByTagName('input')[type[i]-1];
    				 input && inputArr.push(input);
    			};
    			return inputArr;
    		};
    		return false;
    	};
    
    	for(var inputI = 0;inputI<getInput("all").length;inputI++){
    		getInput("all")[inputI].onclick= function(){
    			if(this.checked === false) return;
    			proxySend(this.value);
    		};
    	};
        // 代理发送,通过闭包保存需要发送的val
        // 2000ms没有再去点击checkbox才去发送
    	var proxySend =(function(){
    		var valArr = [];
    		var time;
    		return function(value){
    			idArr.push(value);
    			clearTimeout(time);
    			time = setTimeout(function(){
    				for(var i = 0;i<valArr.length;i++){
    					sendInput(valArr[i]);
    				};
    				valArr = [];
    				time = null;
    			},2000);
    		};
    	})();
    
    	var sendInput = function(value){
    		console.info(value+":发送");
    	};	
    
    缓存代理-代理中保存计算的值(花销大的计算结果),下一次先试着从缓存中调用
    
    	var proxy = (function(){
    		var cache = {};
    		return function(){
    			var args = Array.prototype.join.call( arguments, ',' );
    			console.info(args);	
    			if ( args in cache ){
    				console.info(cache);	
    				return cache[ args ];
    			}
    			return cache[ args ] = mult.apply( this, arguments );
    		}
    		})();
    
    //通过*立即执行函数返回函数形成闭包,保存缓存cache,然后将*arguments拼接作为缓存对象的key,值为计算结果,通过*if(key in object)来得到重复的key
    
    //高级函数与缓存代理
    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 );
    
    alert ( proxyMult( 1, 2, 3, 4 ) ); 
    alert ( proxyMult( 1, 2, 3, 4 ) ); 
    alert ( proxyPlus( 1, 2, 3, 4 ) ); 
    alert ( proxyPlus( 1, 2, 3, 4 ) ); 
    
    不通过立即执行函数,而是调用函数来实现得到闭包,使不同的计算函数得到自己的缓存对象
    
    

    观察者模式-订阅发布(自定义事件-触发)

    订阅--将key作为标志位,将key发生时需要执行的函数保存
    发布--通过key寻找函数,并执行
    
    	var subPub = (function(){
    		var listenList = {};
    		//保存key:[fn1,fn2,fn3]
    		
    		var listen = function(key,fn){
    			if(key in listenList){
    				for(var i = 0 ;i<listenList[key].length ; i++){
    					if(listenList[key][i] == fn)return;
    				}
    			}else{
    				listenList[key] = [];
    			};
    			listenList[key].push(fn);
    		};
            // 判断key与fn情况,然后将函数push保存
    
    		var trigger = function(){
    			var key = [].shift.call(arguments);
    			if(!listenList[key] || listenList[key].length == 0) return false;
    			for(var i = 0 ; i<listenList[key].length ; i++){
    				listenList[key][i].apply(this,arguments);
    			}
    		};
            //通过key得到需要执行的函数,然后将参数传入执行
            
    		var remove = function(key,fn){
    			if(!listenList[key] || listenList[key].length == 0) return false;
    			if(!fn){listenList[key].length = 0;return}
    			for(var i = 0 ; i<listenList[key].length ; i++){
    				if(listenList[key][i] == fn){
    					listenList[key].splice(i,1);
    				}
    			}
    		};
    
    		return {
    			remove:remove,
    			trigger:trigger,
    			listen:listen
    		}
    	})()
    
    
    
  • 相关阅读:
    rsync安装配置实时同步
    ORA-00392: log 4 of thread 2 is being cleared, operation not allowed
    CentOS 6.4安装配置LNMP服务器(Nginx+PHP+MySQL)
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
    常见服务端口
    linux客户端传输文件到Windows本地
    windows/Linux主机重启NetBackup服务和后台进程
    linux命令之grep命令
    linux命令之awk命令
    Shiro安全框架
  • 原文地址:https://www.cnblogs.com/LiangHuang/p/6413914.html
Copyright © 2011-2022 走看看