1、问题:
在面向对象的软件设计中,经常会遇到一些聚集对象,按一定的顺序的遍历访问问题,这个遍历算法究竟应该由谁来实现呢,聚集对象本身?这样聚集对象承受了过多的功能,不仅要维护聚集对象内的元素,还要提供遍历自身的接口,而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历,这不符合单一职责原则。如果将遍历算法交给客户端,会将容器的内部细节暴露无遗,而且客户端与聚集对象高度耦合。分离了集合对象的遍历行为,将遍历算法交给这个迭代器角色来完成,可以很好的避免容器内部细节的暴露,而且也使得设计符合“单一职责原则”,另外迭代器模式抽象了具体迭代器角色,可以通过对一个抽象迭代器多个集成可来完成同一聚集对象的多种遍历。
2、定义:
迭代器(Iterator)模式,又叫做游标(Cursor)模式。
提供一种方法顺序访问一个聚合对象(或容器对象:container)中各个元素, 而又不需暴露该对象的内部表示。
3、意图:
分离了集合对象的遍历行为,将遍历算法交给这个迭代器角色来完成,可以很好的避免容器内部细节的暴露,而且也使得设计符合“单一职责原则”,另外迭代器模式抽象了具体迭代器角色,可以通过对一个抽象迭代器多个集成可来完成同一聚集对象的多种遍历。
4、角色:
a、迭代器角色(Iterator):定义访问和遍历元素的接口。
b、具体迭代器角色(Concrete Iterator):关联到被迭代的具体聚集对象角色,继承迭代器角色实现具体的迭代,并负责管理记录遍历中的当前位置。
c、聚集对象抽象角色(Aggregate):责提供创建具体迭代器角色的接口。
d、具体聚集对象角色(Concrete Aggreate):持有一个对象的集合,实现创建具体迭代器角色的接口,返回集合遍历所依赖的一个迭代器。
5、结构图
6、优点:
a、支持以不同的方式遍历一个集合对象。根据实现方式的不同,效果上会有差别。
b、简化了集合对象的接口。聚集对象不负责提供遍历算法。
c、对同一个容器对象,可以同时进行多个遍历。因为遍历状态是保存在每一个迭代器对象中的。
7、缺点:
a、增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。。
b、集合类与迭代器类非常紧密地关联在一起。
8、应用场景:
a、访问一个容器对象的内容而无需暴露它的内部表示。
b、支持对容器对象的多种遍历。
c、为遍历不同的容器结构提供一个统一的接口。