每天一個設計模式之迭代器模式

每天一個設計模式之迭代器模式

0. 示例代碼

  • 迭代器模式源碼:https://github.com/dongyuanxin/design-pattern-demos/tree/master/iterator_pattern
  • 《每天一個設計模式》系列:摘要地址 (https://godbmw.com/category/%E6%AF%8F%E5%A4%A9%E4%B8%80%E4%B8%AA%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F)

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();
}
  • python 迭代器
  • 《JavaScript 設計模式和開發實踐》


分享到:


相關文章: