每天一個設計模式·迭代器模式
博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用javascript
(靠這吃飯
)和python
(純粹喜歡
)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :)
0. 專案地址
- 迭代器模式原始碼:ofollow,noindex">https://github.com/dongyuanxin/design-pattern-demos/tree/master/iterator_pattern
- 《每天一個設計模式》系列:摘要地址
1. 什麼是迭代器模式?
迭代器模式是指提供一種方法順序訪問一個集合物件的各個元素,使用者不需要了解集合物件的底層實現。
迭代器模式常見和常用的有:內部迭代器、外部迭代器、倒序迭代器等等。
2. 內部迭代器和外部迭代器
內部迭代器:封裝的方法完全接手迭代過程,外部只需要一次呼叫。
外部迭代器:使用者必須顯式地請求迭代下一元素。熟悉C++的朋友,可以類比C++內建物件的迭代器的end()
、next()
等方法。
3. 程式碼實現
3.1 python3 實現
python3的迭代器可以用作for()
迴圈和next()
方法的物件。同時,在實現迭代器的時候,可以在藉助生成器yield
。python會生成傳給yeild
的值。
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
3.2 ES6 實現
這裡實現的是一個外部迭代器。需要實現邊界判斷函式、元素獲取函式和更新索引函式。
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(); }