迭代器(Iterator)模式主要分离集合的遍历行为並抽象出一个迭代器类来负责模式之運作,这样既可以做到不暴露集合内部结构,又可以让外部可透明访问集合内部的数据,当需要对集合結構作不同遍历时便可考虑使用此模式。
UML类图:
示例:
#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_
from abc import ABCMeta, abstractmethod
class Iterator(metaclass= ABCMeta): #迭代器抽象基类
@abstractmethod
def hasNext(self):
raise NotImplementedError
@abstractmethod
def next(self):
raise NotImplementedError
class ConcreteIterator(Iterator): #迭代器具体类
def __init__(self, alist):
self.alist = alist
def hasNext(self): #判別是否还有下一个元素
return self.alist != []
def next(self): #返回下一个元素
return self.alist.pop(0)
class Aggregate(object): #集合抽象基类
@abstractmethod
def iterator(self):
raise NotImplementedError
class ConcreteAggregate(Aggregate): #集合具体类
def __init__(self, alist):
self.alist = alist
def iterator(self): #將集合封裝具迭代器功能
return ConcreteIterator(self.alist)
實際業務邏輯之場景如下:
if __name__ == "__main__":
ca = ConcreteAggregate([1, 2, 3])
cai = ca.iterator()
while cai.hasNext():
print(cai.next())
輸出:
1
2
3
總結:
- 实现功能分离,将迭代功能委托给外部迭代器类來实现
- 可为容器提供统一接口
- 可以为容器或者子容器实现不同的迭代方法