js設(shè)計模式之代理模式及訂閱發(fā)布模式的示例分析

這篇文章將為大家詳細講解有關(guān)js設(shè)計模式之代理模式及訂閱發(fā)布模式的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、崇信網(wǎng)站維護、網(wǎng)站推廣。

1,代理模式,只是學習了虛擬代理以及緩存代理,具體案例

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é)果:

js設(shè)計模式之代理模式及訂閱發(fā)布模式的示例分析

就是利用閉包實現(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é)果:

js設(shè)計模式之代理模式及訂閱發(fā)布模式的示例分析

本質(zhì)上,上述的發(fā)布訂閱只是一個數(shù)組的增刪改查。緩存下增刪改查。

關(guān)于“js設(shè)計模式之代理模式及訂閱發(fā)布模式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

網(wǎng)站欄目:js設(shè)計模式之代理模式及訂閱發(fā)布模式的示例分析
分享鏈接:http://bm7419.com/article32/jjccpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃網(wǎng)站營銷、企業(yè)建站、商城網(wǎng)站、關(guān)鍵詞優(yōu)化、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司