迭代器模式是指提供一種方法順序訪問乙個聚合物件中的各個元素,而又不需要暴露該物件的內部表示。迭代器模式可以把迭代的過程從業務邏輯中分離出來,在使用迭代器模式之後,即使不關心物件的內部構造,也可以按順序訪問其中的每個元素。迭代器模式無非就是迴圈訪問聚合物件中的各個元素。比如 jquery 中的$.each 函式,其中**函式中的引數 i 為當前索引,n 為當前元素,**如下:
$.each( [1, 2, 3], function( i, n ));
var each = function( ary, callback )
};each( [ 1, 2, 3 ], function( i, n ));
var iterator = function( obj );
var isdone = function();
var getcurritem = function();
return
}; var compare = function( iterator1, iterator2 )
iterator1.next();
iterator2.next();
} alert ( 'iterator1 和 iterator2 相等' );
}var iterator1 = iterator( [ 1, 2, 3 ] );
var iterator2 = iterator( [ 1, 2, 3 ] );
compare( iterator1, iterator2 ); // 輸出:iterator1 和 iterator2 相等
迭代器模式的應用
var getuploadobj = function()catch(e)else
}};
在不同的瀏覽器環境下,選擇的上傳方式是不一樣的。因為使用瀏覽器的上傳控制項進行上傳速度快,可以暫停和續傳,所以我們首先會優先使用控制項上傳。如果瀏覽器沒有安裝上傳控制項,則使用 flash 上傳, 如果連 flash 也沒安裝,那就只好使用瀏覽器原生的表單上傳了。看看上面的**,為了得到乙個 upload 物件,這個 getuploadobj 函式裡面充斥了 try,catch以及 if 條件分支。缺點是顯而易見的。第一是很難閱讀,第二是嚴重違反開閉原則。 在開發和除錯過程中,我們需要來回切換不同的上傳方式,每次改動都相當痛苦。後來我們還增加支援了一些另外的上傳方式,比如,html5 上傳,這時候唯一的辦法是繼續往 getuploadobj 函式裡增加條件分支。現在來梳理一下問題,目前一共有 3 種可能的上傳方式,我們不知道目前正在使用的瀏覽器支援哪幾種。就好比我們有乙個鑰匙串,其中共有 3 把鑰匙,我們想開啟一扇門但是不知道該使用哪把鑰匙,於是從第一把鑰匙開始,迭代鑰匙串進行嘗試,直到找到了正確的鑰匙為止。同樣,我們把每種獲取 upload 物件的方法都封裝在各自的函式裡,然後使用乙個迭代器,迭代獲取這些 upload 物件,直到獲取到乙個可用的為止:
var getactiveuploadobj = function()catch(e)
};var getflashuploadobj = function()
return false;
};var getformupladobj = function();
在 getactiveuploadobj、getflashuploadobj、getformupladobj 這 3 個函式中都有同乙個約定:如果該函式裡面的 upload 物件是可用的,則讓函式返回該物件,反之返回 false,提示迭代器繼續往後面進行迭代。所以我們的迭代器只需進行下面這幾步工作。
提供乙個可以被迭代的方法,使得 getactiveuploadobj,getflashuploadobj 以及 getflashuploadobj依照優先順序被迴圈迭代。如果正在被迭代的函式返回乙個物件,則表示找到了正確的 upload 物件,反之如果該函式返回 false,則讓迭代器繼續工作。
var iteratoruploadobj = function()
}};var uploadobj = iteratoruploadobj( getactiveuploadobj, getflashuploadobj, getformupladobj );
重構**之後,我們可以看到,獲取不同上傳物件的方法被隔離在各自的函式裡互不干擾,try、catch 和 if 分支不再糾纏在一起,使得我們可以很方便地的維護和擴充套件**。比如,後來我們又給上傳專案增加了 webkit 控制項上傳和 html5 上傳,我們要做的僅僅是下面一些工作。
增加分別獲取 webkit 控制項上傳物件和 html5 上傳物件的函式:
var getwebkituploadobj = function();
var gethtml5uploadobj = function();
依照優先順序把它們新增進迭代器:
var uploadobj = iteratoruploadobj( getactiveuploadobj, getwebkituploadobj,getflashuploadobj, gethtml5uploadobj, getformupladobj );
設計模式之迭代器模式
概念 提供一種方法順序訪問乙個聚合物件中各個元素,而又不需暴露該物件的內部表示。main 客戶 iproject,產品介面 cproject,產品類 iiterator,迭代器介面 iprojectiterator,產品迭代器介面 cprojectiterator,產品迭代器實現類 說明 cproj...
設計模式之迭代器模式
當你需要訪問乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,而且可能對聚集有多種方式遍歷時,需要為遍歷不同的聚集結構提供如開始,下乙個,是否結束,當前哪一項等 統一介面,你就應該考慮用迭代器模式.提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示.uml設計圖 部分 ite...
設計模式之迭代器模式
說起迭代器,大家一定不陌生,經常使用的foreach in 這種迴圈就是,c 語言已經內建化了迭代器模式,主要是支援對非泛型集合的簡單迭代介面ieumerator和公開列舉數ienumerable。雖然內建了,但是這種模式也有我們學習的必要性。如下 using system using system...