(十一)迭代器模式

2021-10-24 04:39:25 字數 3570 閱讀 3025

迭代器模式 演示

迭代器模式 場景

迭代器模式 總結

這種模式用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。

沒有找到合適的例子,就以乙個常用的 jquery 為示例吧。

>

jquery eachp

>

>

jquery eachp

>

>

jquery eachp

>

src=

"">

script

>

>

var arr =[1

,2,3

]var nodelist = document.

getelementsbytagname

('p'

)var $p =$(

'p')

// 要對這三個變數進行遍歷,需要寫三個遍歷方法

// 第一

arr.

foreach

(function

(item)

)// 第二

var i, length = nodelist.length

for(i =

0; i < length; i++

)// 第三

$p.each

(function

(key, p)

)script

>

如何能寫出乙個方法來遍歷這三種物件呢?

// 如何能寫出乙個方法來遍歷這三種物件呢?

function

each

(data))}

// 測試**

each

(arr)

each

(nodelist)

each

($p)

//順序遍歷有序集合

//使用者不必知道集合的內部結構

其中var $data = $(data)就是乙個迭代器,它可以以統一的方式訪問內部結構,但是不需要知道內部結構是什麼。這就是迭代器模式的主要思想。

先看下傳統的 uml 類圖

簡化之後的 uml 類圖

class

iterator

next()

return

null

}hasnext()

return

true}}

class

container

getiterator()

}// 測試**

let container =

newcontainer([

1,2,

3,4,

5])let iterator = container.

getiterator()

while

(iterator.

hasnext()

)

// 如何能寫出乙個方法來遍歷這三種物件呢?

function

each

(data))}

// 測試**

each

(arr)

each

(nodelist)

each

($p)

//順序遍歷有序集合

//使用者不必知道集合的內部結構

function

each

(data)

// console.log(iterator.next())

// console.log(iterator.next())

// console.log(iterator.next())

// console.log(iterator.next()) // 沒有資料時返回

let item =

while

(!item.done)}}

// 測試**

let arr =[1

,2,3

,4]let nodelist = document.

getelementsbytagname

('p'

)let m =

newmap()

m.set

('a'

,100)m.

set(

'b',

200)

each

(arr)

each

(nodelist)

each

(m)

有乙個問題,symbol.iterator並不是人人都知道,而且這麼讓大家用,每個人都需要封裝乙個each函式,相當不人人性化 —— es6 當然知道這個問題,於是就有了for...of語法。但是你要明白,這個語法最終依賴的還是 es6 iterator ,是基於迭代器模式的。

// `symbol.iterator` 並不是人人都知道

// 也不是每個人都需要封裝乙個 each 方法

// 因此有了 `for...of` 語法

function

each

(data)

}each

(arr)

each

(nodelist)

each

(m)

說明: object 不是有序即可,如果想要 object 的遍歷器功能,可以使用 mapiterator 的價值不限於上述幾個型別的遍歷

還有generator的使用

即只要返回的資料符合 iterator 介面的要求

即可使用iterator 語法,這就是迭代器模式

function

*helloworldgenerator()

var hw =

helloworldgenerator()

;hw.

next()

hw.next()

hw.next()

hw.next

()

當然也可以用for...of

function

*foo()

// 當然也可以用`for...of`

for(

let v of

foo())

以上**放在 nodejs 環境下執行) generator 的語法和應用是另外一部分知識,此處就不展開講解了,拿來只是為了理解迭代器模式的設計思想。

設計原則驗證:

python基礎(十一) 迭代器與生成器

python中的序列型別都是可迭代的物件,例如列表 元組和字串。可以通過for迴圈來遍歷。iter 函式可以手動的建立可迭代物件。迭代器一次只能取乙個值,迭代器取值不能回退,只能一直往前取。當迭代器的值取盡的時候會報stopiteration的錯誤。iter 和 next 構成了迭代協議,迭代器擁有...

迭代器模式

迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而不是暴露該物件的內部表示。乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,你就應該考慮用迭代器模式。你需要對聚集有多種方式遍歷時,可以考慮用迭代器模式。為遍歷不同的聚集結構提供如開始,下乙個,是否結束,當前哪一項等統一...

迭代器模式

我最早接觸的設計模式就是迭代器模式了哈 為什麼要有迭代器模式呢?看下下面的 就知道了哈 對於乙個陣列物件sz 我們要怎麼遍歷呢?public void bianlisz class geweishu public myiterator getiterator private class geweis...