js設(shè)計模式之代理模式及訂閱發(fā)布模式實例詳解
本文實例講述了js設(shè)計模式之代理模式及訂閱發(fā)布模式。分享給大家供大家參考,具體如下:
為啥將兩種模式放在一起呢?因為這樣文章比較長啊。
寫博客的目的我覺得首要目的是整理自己的知識點,進而優(yōu)化個人所得知識體系。知識成為個人的知識,就在于能夠用自己的話表達同一種意義。
本文是設(shè)計模式系列文章的第二篇文章,第一篇:。
1,代理模式,只是學(xué)習了虛擬代理以及緩存代理,具體案例
1)虛擬代理
//業(yè)務(wù)代碼
var myImage = (function() {
var imgNode = document.createElement("img");
document.body.appendChild(imgNode);
return {
setSrc: function(src) {
console.log(1111);
imgNode.src = src;
}
}
})();
// 設(shè)計模式代碼
var ProxyImage = (function() {
var img = new Image();
//這個img只是用來判斷圖片是否加載完成,加載完成之后修改圖片鏈接
img.onload = function() {
console.log(this);
myImage.setSrc(this.src);
};
return {
setSrc: function(src) {
console.log(22);
myImage.setSrc("http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif");
img.src = src;
}
}
})();
這個例子好吧,拿來主義。說一下自己的理解:上面的業(yè)務(wù)代碼實現(xiàn)的是將一個圖片dom插入到dom樹之中,代理模式則是通過創(chuàng)建一個新的img元素,通過判斷onload判斷是否加載完成,然后替換原有鏈接。
2)下面是緩存代理:
<script>
//緩存代理
// 計算乘法
var mult = function() {
var a = 1;
for (var i = 0, ilen = arguments.length; i < ilen; i += 1) {
a = a * arguments[i];
}
return a;
};
// 代理函數(shù)
var proxyFunc = 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 = proxyFunc(mult);
console.log(proxyMult(1, 2, 3, 4)); // 24
console.log(proxyMult(1, 2, 3, 4)); // 緩存取 24
</script>
運行結(jié)果:

就是利用閉包實現(xiàn)原有計算數(shù)據(jù)的緩存。
2,訂閱發(fā)布模式
<script>
var Event = (function(){
var list = {},
listen,
trigger,
remove;
//添加訂閱對象
listen = function(key,fn){
if(!list[key]) {
list[key] = [];
}
list[key].push(fn);
};
//觸發(fā)訂閱內(nèi)容
trigger = function(){
var key = Array.prototype.shift.call(arguments),
fns = list[key];
if(!fns || fns.length === 0) {
return false;
}
for(var i = 0, fn; fn = fns[i++];) {
fn.apply(this,arguments);
}
};
//刪除訂閱內(nèi)容
remove = function(key,fn){
var fns = list[key];
if(!fns) {
return false;
}
if(!fn) {
fns && (fns.length = 0);
}else {
for(var i = fns.length - 1; i >= 0; i--){
var _fn = fns[i];
if(_fn === fn) {
fns.splice(i,1);
}
}
}
};
return {
listen: listen,
trigger: trigger,
remove: remove
}
})();
// 測試代碼如下:
Event.listen("color",function(size) {
console.log("尺碼為:"+size); // 打印出尺碼為42
});
Event.trigger("color",42);
</script>
運行結(jié)果:

本質(zhì)上,上述的發(fā)布訂閱只是一個數(shù)組的增刪改查。緩存下增刪改查。
本文結(jié)束。
感興趣的朋友可以使用在線HTML/CSS/JavaScript前端代碼調(diào)試運行工具:http://tools.jb51.net/code/WebCodeRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容還可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
JavaScript學(xué)習總結(jié)之JS、AJAX應(yīng)用
這篇文章主要介紹了JavaScript學(xué)習總結(jié)JS AJAX應(yīng)用 的相關(guān)資料,需要的朋友可以參考下2016-01-01
JS如何實現(xiàn)form表單登錄驗證并使用MD5加密詳解
表單驗證為終端用戶檢測無效的數(shù)據(jù)并標記這些錯誤,是一種用戶體驗的優(yōu)化,下面這篇文章主要給大家介紹了關(guān)于JS如何實現(xiàn)form表單登錄驗證并使用MD5加密的相關(guān)資料,需要的朋友可以參考下2023-06-06
JS開發(fā)中基本數(shù)據(jù)類型具體有哪幾種
JS的數(shù)據(jù)類型包括基本數(shù)據(jù)類型、復(fù)雜數(shù)據(jù)類型和特殊數(shù)據(jù)類型,今天我們主要先講解一下基本數(shù)據(jù)類型。感興趣的朋友一起看看吧2017-10-10
layui-tree實現(xiàn)Ajax異步請求后動態(tài)添加節(jié)點的方法
今天小編就為大家分享一篇layui-tree實現(xiàn)Ajax異步請求后動態(tài)添加節(jié)點的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
通過JS獲取Request.QueryString()參數(shù)的值實現(xiàn)方法
下面小編就為大家?guī)硪黄ㄟ^JS獲取Request.QueryString()參數(shù)的值實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09

