博主按:《天天一個設計模式》旨在初步領會設計模式的精髓,目前採用
javascript
(靠這吃飯)和python
(純粹喜歡)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :)javascript
迭代器模式是指提供一種方法順序訪問一個集合對象的各個元素,使用者不須要了解集合對象的底層實現。java
迭代器模式常見和經常使用的有:內部迭代器、外部迭代器、倒序迭代器等等。python
內部迭代器:封裝的方法徹底接手迭代過程,外部只須要一次調用。git
外部迭代器:用戶必須顯式地請求迭代下一元素。熟悉C++的朋友,能夠類比C++內置對象的迭代器的 end()
、next()
等方法。es6
python3的迭代器能夠用做for()
循環和next()
方法的對象。同時,在實現迭代器的時候,能夠在藉助生成器yield
。python會生成傳給yeild
的值。github
def my_iter(): yield 0, "first" yield 1, "second" yield 2, "third" if __name__ == "__main__": # 方法1: Iterator能夠用for循環 for (index, item) in my_iter(): print("At", index , "is", item) # 方法2: Iterator能夠用next()來計算 # 須要藉助 StopIteration 來終止循環 _iter = iter(my_iter()) while True: try: index,item = next(_iter) print("At", index , "is", item) except StopIteration: break
這裏實現的是一個外部迭代器。須要實現邊界判斷函數、元素獲取函數和更新索引函數。設計模式
const Iterator = obj => { let current = 0; let next = () => current += 1; let end = () => current >= obj.length; let get = () => obj[current]; return { next, end, get } } let myIter = Iterator([1, 2, 3]); while(!myIter.end()) { console.log(myIter.get()) myIter.next(); }