代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子。但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处。在我看来,代理模式最大的好处,就是在不动原有对象的同时,可以给原有对象增加一些新的特性或者行为。
/**
* pre:代理模式
* 小明追求A,B是A的好朋友,小明比较腼腆,不好意思直接将花交给A,
* 于是小明将花交给B,再由B交给A.
*/
//----------- 示例1 ---------
// 不使用代理
var Flower = function() {};
var xiaoming = {
sendFlower: function(target) {
var flower = new Flower();
target.receiveFlower(flower);
}
};
var A = {
receiveFlower: function(flower) {
console.log("收到花:" + flower);
}
};
xiaoming.sendFlower(A);
// ----------- 示例2 --------------
// 使用代理1
var Flower = function() {};
var xiaoming = {
sendFlower: function(target) {
var flower = new Flower();
B.receiveFlower(flower);
}
};
var B = {
receiveFlower: function(flower) {
A.receiveFlower(flower);
}
};
var A = {
receiveFlower: function(flower) {
console.log("收到花:" + flower);
}
};
xiaoming.sendFlower(B);
//------------- 示例3 ---------------
/*
* 使用代理2
* 从示例1和示例2,看不出使用代理有什么用处,B只不过是从中间转手了一次。
* 接下来,我们想一下。给喜欢的人送花,怎样才能提高成功率呢?
* 我们都知道,人有心情好和心情差的时候,当|美女|心情好的时候,送花成功的概率自然要大些。
* 于是,我们将代理升级,监听|美女|的心情,心情好的时候再给她送花。
* 为了演示,我们假设2秒后,A的心情变好。
*/
var Flower = function() {};
var xiaoming = {
sendFlower: function(target) {
var flower = new Flower();
B.receiveFlower(flower);
}
};
var B = {
receiveFlower: function(flower) {
A.listenGoodMood(function() {
A.receiveFlower(flower);
});
}
};
var A = {
receiveFlower: function(flower) {
console.log("收到花:" + flower);
},
listenGoodMood: function(fn) {
setTimeout(function() {
fn.apply(this, arguments);
}, 2000);
}
};
xiaoming.sendFlower(B);
// ---------- 示例4 ---------------
/*
* 【代理模式用处】:虚拟代理
* 这里以加载图片为例,我们都知道当网络不畅以及图片过大时,图片加载都比较慢,
* 为了更好的用户体验,我们都会在原图片未加载完成前,加上loading图片。
* */
//--4 _01未使用代理--
var myImage = (function() {
var imgNode = document.createElement("img");
document.body.appendChild(imgNode);
return {
setSrc: function(src) {
this.imgNode.src = src;
}
}
})();
myImage.setSrc("xxx");
//--4_02使用代理--
var proxyMyImage = (function() {
var img = new Image();
img.onload = function() {
myImage.setSrc(this.src);
};
return {
setSrc: function(src) {
myImage.setSrc("loading.jpg");
img.src = src;
}
}
})();
proxyMyImage.setSrc("xxx");
/*
* [注]:这里可以看到代理模式的好处:在不改变原有接口的同时,可以为系统添加新的行为。
*/
//--------- 示例5---------------
/*
* 【代理模式用处】:合并http请求
* 这里以选择文件同步为例。
* 以往用户同步文件,在用户选中的时候就触发,这种方法做到了实时性,但无疑增加了网络的开销。
* 实际在使用的过程中,往往并不需要立刻就同步。
* 以下通过代理模式,将在用户选中文件2秒后进行同步请求。
* */
// --- 包含一段html代码,请自行添加到一个文件中 ------
<html>
<body>
<button id="input">点我上传</button>
<input type="checkbox" id="1"></input>1
<input type="checkbox" id="2"></input>2
<input type="checkbox" id="3"></input>3
<input type="checkbox" id="4"></input>4
<input type="checkbox" id="5"></input>5
<input type="checkbox" id="6"></input>6
<input type="checkbox" id="7"></input>7
<input type="checkbox" id="8"></input>8
<input type="checkbox" id="9"></input>9
</body>
</html>
// -- 上传文件 --
var synchronizeFile = function(id) {
console.log("开始同步文件:" + id);
};
var proxySynchronizeFiles = (function() {
var fileCache = [],
timer;
return function(id) {
fileCache.push(id);
if(timer) {
return;
}
timer = setTimeout(function() {
synchronizeFile(fileCache.join(","));
clearTimeout(timer);
timer = null;
checkArr.length = 0;
}, 2000);
}
})();
var checkArr = document.getElementsByTagName("input");
for(var i = 0, c; c = checkArr[i++];) {
c.onclick = function() {
if(this.checked == true) {
proxySynchronizeFiles(this.id);
}
}
}
// ------------ 示例6 -----------------
/*
* 【代理模式用处】:缓存代理
* 以计算器为例,比如计算某些数的乘积,当参数重复时,我们希望不用重复计算,直接返回结果。
* 以下用到代理模式做缓存。
*/
var mult = function() {
if(!arguments) {
console.log("请输入参数");
return;
}
var a = 1;
for(var i = 0, b; b = arguments[i++];) {
a = a * b;
}
return a;
};
var proxyMult = (function() {
var cache = {};
return function() {
var str = Array.prototype.join.call(arguments, ",");
if(str in cache) {
console.log("重复return.");
return cache[str];
}
return cache[str] = mult.apply(this, arguments);
}
})();
console.log(proxyMult(2, 3, 4));
console.log(proxyMult(2, 3, 4));
//------------ 示例7 --------------
/*
* 缓存代理升级 - 通用版计算
*
*/
var mult = function() {
if(!arguments) {
return;
}
var t = 1;
for(var i = 0, a; a = arguments[i++];) {
t = t * a;
}
return t;
};
var plus = function() {
if(!arguments) {
return;
}
var t = 0;
for(var a of arguments) {
t += a;
}
return t;
};
var createProxyCaculate = function(fn) {
var cache = {};
return function() {
var str = Array.prototype.join.call(arguments, ",");
if(str in cache) {
console.log("重复return" + str);
return cache[str];
}
return cache[str] = fn.apply(this, arguments);
}
};
var proxyMult = createProxyCaculate(mult);
var proxyPlus = createProxyCaculate(plus);
console.log(proxyMult(2, 3, 4));
console.log(proxyMult(2, 3, 4));
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# js
# 代理模式
# 深入理解JavaScript系列(31):设计模式之代理模式详解
# JavaScript的设计模式经典之代理模式
# JavaScript设计模式之缓存代理模式原理与简单用法示例
# 详解javascript设计模式三:代理模式
# js设计模式之代理模式及订阅发布模式实例详解
# javascript设计模式 – 代理模式原理与用法实例分析
# javascript设计模式之代理模式
# JavaScript 设计模式中的代理模式详解
# 为例
# 小明
# 送花
# 加载
# 的人
# 都是
# 有什么
# 将在
# 会在
# 是从
# 好朋友
# 这也
# 不动
# 请输入
# 可以看到
# 可以直接
# 看不出
# 就说
# 人会
# 过大
相关文章:
如何快速生成专业多端适配建站电话?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
linux top下的 minerd 木马清除方法
官网网站制作腾讯审核要多久,联想路由器newifi官网
完全自定义免费建站平台:主题模板在线生成一站式服务
名字制作网站免费,所有小说网站的名字?
模具网站制作流程,如何找模具客户?
如何高效利用亚马逊云主机搭建企业网站?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
高防服务器租用首荐平台,企业级优惠套餐快速部署
微信小程序 五星评分(包括半颗星评分)实例代码
seo网站制作优化,网站SEO优化步骤有哪些?
深圳网站制作案例,网页的相关名词有哪些?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
建站VPS配置与SEO优化指南:关键词排名提升策略
公司门户网站制作流程,华为官网怎么做?
制作宣传网站的软件,小红书可以宣传网站吗?
行程制作网站有哪些,第三方机票电子行程单怎么开?
实现虚拟支付需哪些建站技术支撑?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何选择高性价比服务器搭建个人网站?
广平建站公司哪家专业可靠?如何选择?
建站主机解析:虚拟主机配置与服务器选择指南
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
如何通过FTP空间快速搭建安全高效网站?
高端建站如何打造兼具美学与转化的品牌官网?
Thinkphp 中 distinct 的用法解析
如何在Windows 2008云服务器安全搭建网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
公司网站设计制作厂家,怎么创建自己的一个网站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
网站设计制作企业有哪些,抖音官网主页怎么设置?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
学校为何禁止电信移动建设网站?
如何通过宝塔面板实现本地网站访问?
网站制作软件有哪些,制图软件有哪些?
如何快速搭建高效WAP手机网站?
,网页ppt怎么弄成自己的ppt?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何通过云梦建站系统实现SEO快速优化?
如何在建站之星绑定自定义域名?
浅谈Javascript中的Label语句
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何用低价快速搭建高质量网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
*请认真填写需求信息,我们会在24小时内与您取得联系。