第一、定义: 代理模式是为一个对象提供代用品或者占位符,以便控制对它的访问。

    比如说,某男生小明想向他的女神 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 设计模式 之 代理模式的更多相关文章

  1. 第二章 --- 关于Javascript 设计模式 之 策略模式

    这一章节里面,我们会主要的针对JavaScript中的策略模式进行理解和学习 一.定义 策略模式: 定义一系列的算法,把他们封装起来,并且是他们可以相互替换. (这样的大的定义纲领,真的不好理解,特别 ...

  2. JavaScript设计模式之代理模式

    一.代理模式概念 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象控制具体对象的引用.代理几乎可 ...

  3. JavaScript 设计模式之代理模式

    一.代理模式概念解读 1.代理模式概念文字解读 代理,顾名思义就是帮助别人做事,GOF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象 ...

  4. JavaScript设计模式(代理模式)

    一.简单的单例模式: 1.未使用代理模式的情况:小明直接给女神送花 var Flower = function() {} var xiaoming = { sendFlower: function( ...

  5. JavaScript设计模式_03_代理模式

    代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子.但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处.在我看来,代理模式最 ...

  6. 学习javascript设计模式之代理模式

    1.代理模式为一个对象提供一个代用品或占位符,以便控制对它的访问. 2.不用代理模式: 客户 -> 本体  使用代理模式:  客户 -> 代理 -> 本体 3.例子场景1 点击操作与 ...

  7. JavaScript设计模式-19.代理模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 第四章 --- 关于Javascript 设计模式 之 迭代器模式

    今天我先写 两个常用的迭代器的 例子.(同学们先自行体会这二种迭代器的优缺点) 需求:比较两个数组是否相等 tips: 当数组的下标不为数字的时候,默认为 该键值对 为 对象. 然后迭代器的原理基本来 ...

  9. C#设计模式(13)——代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

随机推荐

  1. ambari2.4.2_centos7 学习全纪录

    目录: 为什么要用Ambari 概念概述 原理简介 安装 创建集群 创建集群 手动修改配置 NameNode HA 安装SmartSense 二次开发 为什么要用Ambari Ambari 是 Apa ...

  2. C#体检套餐项目

    使用泛型集合写的一个小项目 1.要实现新建体检套餐,并且如果已经有了该体检套餐就不能再次新建, 2.要实现套餐列表动态更新,没添加一个体检套餐,在套餐列表里就自动添加一项; 3.向当前套餐类表里添加检 ...

  3. [LeetCode] Binary Tree Right Side View 二叉树的右侧视图

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  4. [LeetCode] Sort Colors 颜色排序

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  5. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

  6. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  7. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?

    注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...

  8. 【Quartz】将定时任务持久化到数据库

    之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果,我们需要在 ...

  9. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

  10. 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息

    ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...