意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
python 实现
class BaseIterator:
def __init__(self,data):
self.__data = data
def to_begin(self):
self.__cur_idx = -1
def to_end(self):
self.__cur_idx = len(self.__data)
def next(self):
if(self.__cur_idx <len(self.__data) -1):
self.__cur_idx +=1
return True
else:
return False
def privious(self):
if self.__cur_idx >0:
self.__cur_idx-=1
return True
else:
return False
def current(self):
return self.__data[self.__cur_idx] if self.__cur_idx<len(self.__data) and self.__cur_idx >=0 else None
if __name__ == '__main__':
iterator = BaseIterator(range(0,20))
iterator .to_begin()
while(iterator.next()):
customer = iterator.current()
print(customer,end="\t")
print()
iterator.to_end()
while(iterator.privious()):
customer = iterator.current()
print(customer,end="\t")
python 本身实现
from collections import Iterable, Iterator
"""
要使自定义的类具有Iterable属性,需要实现__iter__方法。
要使自定义的类具有Iterator属性,需要实现__iter__和__next__方法
"""
class NumberSequence:
""" 生成一个间隔为step的数字系列 """
def __init__(self, init, step, max=100):
self.__data = init
self.__step = step
self.__max = max
def __iter__(self):
return self
def __next__(self):
if self.__data < self.__max:
tmp = self.__data
self.__data += self.__step
return tmp
else:
raise StopIteration
if __name__ == '__main__':
num_seq = NumberSequence(0, 5, 20)
print(isinstance(num_seq, Iterable))
print(isinstance(num_seq, Iterator))
for n in num_seq:
print(n, end="\t")
dart 实现
abstract class Iterator {
bool hasNext();
Object? next();
}
abstract class Container {
Iterator getIterator();
}
class NameRespository implements Container {
List<String> names = ["reboert", "john", "julic", "lora"];
@override
Iterator getIterator() {
return NameIterator(names);
}
}
class NameIterator implements Iterator {
List<String> _names;
int _index = 0;
NameIterator(this._names);
@override
bool hasNext() {
if (_index < _names.length) {
return true;
}
return false;
}
@override
Object? next() {
if (this.hasNext()) {
return _names[_index++];
}
return null;
}
}
void main(List<String> args) {
NameRespository nameRepository = NameRespository();
for (Iterator iter = nameRepository.getIterator(); iter.hasNext();) {
Object? name = iter.next();
print("name = $name ");
}
}