序、设计模式分类
一、装饰者模式(原型链)
二、策略模式
三、代理模式
四、发布订阅模式
五、迭代器模式
六、工厂模式
七、外观模式
八、状态模式
九、单例模式
十、适配器模式
参考:https://blog.youkuaiyun.com/wuyufa1994/article/details/86557788
一、虚拟代理
1. 简易虚拟代理例子
function Flower(){};
var xiaoming = {
sendFlower : function(target) {
var flower = new Flower();
target.recieveFlower(flower);
}
}
var a = {
recieveFlower: function(flower) {
console.log('A收到花了' + toString.call(flower));
},
listenGoodMood: function(fn) {
setTimeout(function() {
fn();
}, 1000);
}
}
var b = {
recieveFlower: function(flower) {
a.listenGoodMood(function() {
a.recieveFlower(flower);
})
}
}
xiaoming.sendFlower(b);
2. 图片占位加载例子
var myImage = (function(){
var imgNode = document.createElement( 'img' );
document.body.appendChild( imgNode );
return function( src ){
imgNode.src = src;
}
})();
var proxyImage = (function(){
var img = new Image;
img.onload = function(){
myImage( this.src );
}
return function( src ){
myImage( 'file:// /C:/Users/svenzeng/Desktop/loading.gif' );
img.src = src;
}
})();
proxyImage( 'http:// imgcache.qq.com/music// N/k/000GGDys0yA0Nk.jpg' );
二、缓存代理
1. 缓存代理的例子——计算乘积
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 );
}
})();
proxyMult( 1, 2, 3, 4 ); // 输出:24
proxyMult( 1, 2, 3, 4 ); // 输出:24
其他代理模式
代理模式的变体
种类非常多,限于篇幅及其在JavaScript中的适用性,这里只简约介绍一下这些代理,就不一一详细展开说明了。
-
防火墙代理:控制网络资源的访问,保护主题不让“坏人”接近。
-
远程代理:为一个对象在不同的地址空间提供局部代表,在Java中,远程代理可以是另一个虚拟机中的对象。
-
保护代理:用于对象应该有不同访问权限的情况。
-
智能引用代理:取代了简单的指针,它在访问对象时执行一些附加操作,比如计算一个对象被引用的次数。
-
写时复制代理:通常用于复制一个庞大对象的情况。写时复制代理延迟了复制的过程,当对象被真正修改时,才对它进行复制操作。写时复制代理是虚拟代理的一种变体,DLL(操作系统中的动态链接库)是其典型运用场景。