<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] >[success] # 什么是迭代器模式(菜鳥教程中代理模式總結) ~~~ 1.迭代器模式(Iterator),提供一種方法順序訪問一個聚合對象中的各種元素, 而又不暴露該對象的內部表示。 2.主要解決:不同的方式來遍歷整個整合對象。 3.何時使用:遍歷一個聚合對象。 4.如何解決:把在元素之間游走的責任交給迭代器,而不是聚合對象 ~~~ >[danger] ##### 優缺點 * 優點 ~~~ 1、它支持以不同的方式遍歷一個聚合對象。 2、迭代器簡化了聚合類。 3、在同一個聚合上可以有多個遍歷。 4、在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼。 ~~~ * 缺點 ~~~ 1、由于迭代器模式將存儲數據和遍歷數據的職責分離,增加新的聚合類需要對應增加新的迭代器類, 類的個數成對增加,這在一定程度上增加了系統的復雜性。 ~~~ >[danger]使用場景 ~~~ 1、訪問一個聚合對象的內容而無須暴露它的內部表示。 2、需要為聚合對象提供多種遍歷方式。 3、為遍歷不同的聚合結構提供一個統一的接口。 ~~~ >[success] # 前端的代理模式 ~~~ 1.書中作者舉了一個之前重構代碼遇到的案例。并且將其重構成了迭代模式 2.更多的迭代使用在js中可以參考es6章節的迭代器 ~~~ >[danger] ##### 在這之前我要記錄一個書中看到有意思代碼塊 ~~~ var each = function (ary,callback) { for(var i=0,l=ary.length;i<l; i++){ callback.call(ary[i],i,ary[i]) } } each([1,2,3],function (i,n) { console.log(i,n) }) ~~~ >[danger] ##### 書中作者遇到的案例 ~~~ 1.下面代碼會針對不同瀏覽器來調用對應上傳機制,代碼違反一個原則封閉開放原則, 如果后續在有針對的下載機制需要接著在這個if...else 添加 2.用書中的話來說:目前一共有3種可能上傳的方式,我們不知道目前正在使用的瀏覽器支持哪幾種。 就好比我們有一個鑰匙串,其中共有3把鑰匙,我們想打開一扇門但是不知道用哪把鑰匙, 于是從第一把開始,迭代鑰匙串進行嘗試,直到找到正確的鑰匙為止。 ~~~ ~~~ var getUploadObj = function(){ try{ return new ActiveXObject(‘TXFINActiveX.FTNUpload”); //ie上傳 }catch(e){ if(supportFlash()){ var str = '<object type="application/x-shockwave-flash"></object>'; return $(str).appendTo($('body')); }else{ var str = '<input name = "file" type="file"/>’ return $(str).appendTo($("body")); } } } ~~~ >[danger] ##### 改造后的代碼 ~~~ 1.在上述的3個函數中我們都有同一個約定,如果該函數里面的upload對象是可用的, 則讓函數返回該對象,反之返回false,提示迭代器繼續往后進行迭代 ~~~ ~~~ var getActiveUploadObj = function(){ try{ return new ActiveXObject("TXFNActiveX.FTNUpload"); }catch(e){ return false; } } var getFlashUploadObj = function(){ if(supportFlash()){ var str = '<object type="application/x-shockwave-flash"></object>'; return $(str).appendTo($('body')); } return false; } var getFormUploadObj = function(){ var str = '<inputname ="file" type="file" />'; return$(str).appendTo($('body')); } ~~~ * 使用迭代 ~~~ 1.下面這個最終的優化調用感覺很像策略模式,但又和策略模式有了區別,策略是會在'Context' 根據條件選擇要執行的策略,但是下面是全部循環沒有具體情況直到找到自己想要的的對象 ~~~ ~~~ var iteratorUploadObj = function(){ for(var i=0,fn;fn=arguments[i++];){ var uploadObj =fn(); if(uploadObj!==false){ return uploadObj; } } } var uploadObj = iteratorUploadObj(getActiveUploadObj,getFlashUploadObj, getFormUploadObj); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看