第三章 --- 关于Javascript 设计模式 之 代理模式
第一、定义: 代理模式是为一个对象提供代用品或者占位符,以便控制对它的访问。
比如说,某男生小明想向他的女神 A 表白,刚好小明认识的一个女生B 和 女神A 是好朋友,那么小明就想让 女生B 帮忙送花给 女神A 。
这个就是一个代理模式。
第二、Show Code
var Flower = function(){};
var xiaoming = {
sendFlower: function(target){
var flower = new Flower();
target.receiveFlower( flower );
}
};
var B = {
receiveFlower: function(flower){
A.receiveFlower(flower);
}
};
var A = {
receiveFlower: function(flower){
console.log("收到花了" + flower);
}
}
xiaoming.sendFlower(B);
到这里我们就实现了简单的 代理模式,那就有同学问了,这个代理模式写出来有什么用呢?
对,不仅没什么用,反而让程序的代码变复杂了。
那我们假设这么一种情况,在女神A 的心情好的时候 小明送花的成功率会提高 60%; 而当女神A 心情不好的时候,小明送花的成功率只有 1%; (毕竟小明送的不是宝马车 =。= )
那么女生B 是刚刚好能够知道女神A 的心情的,那么通过 女生B 确定好送花的时间,那么小明的成功率是不是会成功很多呢,从此走上人生巅峰呢?
好,我们接着往下 完善 上面的代码。
var Flower = function(){};
var xiaoming = {
sendFlower: function(target){
var flower = new Flower();
target.receiveFlower( flower );
}
};
var B = {
receiveFlower: function(flower){
A.listenGoodMood(function(){ //监听女神A 的心情
A.receiveFlower(flower);
});
}
};
var A = {
receiveFlower: function(flower){
console.log("收到花了" + flower);
},
listenGoodMood: function( fn ){
setTimeout(function(){
fn();
},10000); //十秒钟后女神的心情变好
}
}
xiaoming.sendFlower(B);
这样,我们就监听到了女神A 的心情变化,再送花给她,那么小明的成功率会高很多啦~
第三、代理模式也是分种类的,这里我们 把 它分为 保护代理 和 虚拟代理
1、保护代理:还是拿上面的例子来说,如果有人继续给 女神A 送各种礼物,但是在 女生B 哪里就已经有了一个 过滤条件,有没房子啊,又没车啊。等等,如果要求达不到,那么这个请求直接就在 B 那里就 过滤掉了。
2、虚拟代理: 在上面的 案例中 new flower() 在程序的世界里是一种昂贵的 操作,那么,我们可以把 new flower() 这个过程 放到当 女神A 心情好的时候我们再去 new flower(), 这就是代理的另外一种模式,叫做 虚拟代理。
第四:我们来用 虚拟代理的方式 来实现 图片预加载。(我们还是直接上代码)
(图片预加载技术是一种常用的web技术,如果直接给 img 标签设置 src 属性,由于图片过大或者网络不佳,图片的位置往往有一段时间是空白的,我们常见的做法是 先用一张loading 图 来占位,然后异步的方式加载图片,等图片加载好了再把它填充到img 节点里)
var myImage = (function(){
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
return {
setSrc: function(src){
imgNode.src = src;
}
}
})();
var proxyImage = (function(){
var img = new Image;
img.onload = function(){
myImage.setSrc(this.src);
}
return {
setSrc: function(src){
myImage.setSrc("img/donated.jpg");
img.src = src;
}
}
})();
proxyImage.setSrc("http://g.hiphotos.baidu.com/zhidao/pic/item/63d9f2d3572c11dfff955ae3612762d0f603c2ae.jpg");
效果实现了
最后我们再实现一个 缓存代理模式
var mult = function(){
var a = 1;
for (var i = 0; i < arguments.length; i++) {
a = a*arguments[i]
};
return a;
}
// var result = mult(1,2,3,4);
// console.log(result);
var proxyMult =(function(){
var cache = {};
return function(){
var args = Array.prototype.join.call(arguments,',');
if(args in cache){
return cache[args];
}
return cache[args] = mult.apply(this,arguments);
}
})();
var result = proxyMult(1,2,3,4);
var result1 = proxyMult(1,2,3,4);
console.log(result,result1);
第三章 --- 关于Javascript 设计模式 之 代理模式的更多相关文章
- 第二章 --- 关于Javascript 设计模式 之 策略模式
这一章节里面,我们会主要的针对JavaScript中的策略模式进行理解和学习 一.定义 策略模式: 定义一系列的算法,把他们封装起来,并且是他们可以相互替换. (这样的大的定义纲领,真的不好理解,特别 ...
- JavaScript设计模式之代理模式
一.代理模式概念 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象控制具体对象的引用.代理几乎可 ...
- JavaScript 设计模式之代理模式
一.代理模式概念解读 1.代理模式概念文字解读 代理,顾名思义就是帮助别人做事,GOF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象 ...
- JavaScript设计模式(代理模式)
一.简单的单例模式: 1.未使用代理模式的情况:小明直接给女神送花 var Flower = function() {} var xiaoming = { sendFlower: function( ...
- JavaScript设计模式_03_代理模式
代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子.但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处.在我看来,代理模式最 ...
- 学习javascript设计模式之代理模式
1.代理模式为一个对象提供一个代用品或占位符,以便控制对它的访问. 2.不用代理模式: 客户 -> 本体 使用代理模式: 客户 -> 代理 -> 本体 3.例子场景1 点击操作与 ...
- JavaScript设计模式-19.代理模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 第四章 --- 关于Javascript 设计模式 之 迭代器模式
今天我先写 两个常用的迭代器的 例子.(同学们先自行体会这二种迭代器的优缺点) 需求:比较两个数组是否相等 tips: 当数组的下标不为数字的时候,默认为 该键值对 为 对象. 然后迭代器的原理基本来 ...
- C#设计模式(13)——代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
随机推荐
- Hadoop分布式系统的安装部署
1.关于虚拟机的复制 新建一台虚拟机,系统为CentOS7,再克隆两台,组成一个三台机器的小集群.正常情况下一般需要五台机器(一个Name节点,一个SecondName节点,三个Data节点.) 此外 ...
- Linux下MySQL慢查询分析mysqlsla安装使用
说明: 操作系统:CentOS 5.X 64位 MySQL版本:mysql-5.5.35 MySQL配置文件:/etc/my.cnf MySQL 数据库存放目录:/data/mysql 实现目的:开启 ...
- Spring, MyBatis 多数据源的配置和管理
同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其它还 ...
- Oracle 数据库导入导出 dmp文件
转自: http://hi.baidu.com/ooofcu/blog/item/ec5d1f9580d41f007af48077.html 首先询问对方数据库的表空间名称和大小,然后在你的oracl ...
- 【FLUENT案例】03:冲蚀
1 引子2 问题描述3 模型准备4网格5模型设置6 材料设置7 设定注入器8 修改材料9 Cell zone Conditions设置10 边界条件设置10.1 inlet入口设置10.2 出口设置1 ...
- 初识NodeJS
1.JavaScript 模块化规范 浏览器环境 AMD Asynchronous Module Definition RequireJS CMD Common Module Definition S ...
- 【codevs1106】 篝火晚会
http://codevs.cn/problem/1106/ (题目链接) 题意 将1~n顺序排列的环改成另一个环,问n-不动点数. Solution 啊智障啦,不会做×_× 左转hzwer 代码 / ...
- [LeetCode] Search for a Range 搜索一个范围
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- 三石推荐!把 Bootstrap 小清新带回家!
无敌传送门:http://fineui.com/demo_pro/default.aspx?theme=bootstrap1&menu=accordion 喜欢就来赞一个! 把麻烦留给三石 ...
- leecode系列--Two Sum
学习这件事在任何时间都不能停下.准备坚持刷leecode来提高自己,也会把自己的解答过程记录下来,希望能进步. Two Sum Given an array of integers, return i ...