設計模式之迭代器模式

2022-09-19 05:18:12 字數 2649 閱讀 2004

迭代器模式是指提供一種方法順序訪問乙個聚合物件中的各個元素,而又不需要暴露該物件的內部表示。迭代器模式可以把迭代的過程從業務邏輯中分離出來,在使用迭代器模式之後,即使不關心物件的內部構造,也可以按順序訪問其中的每個元素。

迭代器模式無非就是迴圈訪問聚合物件中的各個元素。比如 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...