19 lines
2.5 KiB
Markdown
19 lines
2.5 KiB
Markdown
|
# 迭代器模式,给你更高大上的遍历体验~
|
|||
|
```
|
|||
|
写代码不少使用数组或者类似的集合对象吧?每次要遍历一遍数组怎么办?For 循环!或者while循环,一个一个访问每个位置的元素,直到数组末尾。STL里面甚至有专门的迭代器,针对具体的集合类对象,有对应使用的迭代器。STL的迭代器提供了丰富的遍历方法,如访问集合对象的首位元素、末位元素、指定位置的元素、下一个元素……怎么样,是不是感觉有了迭代器,遍历方法不再是难事了?
|
|||
|
```
|
|||
|
## 1.迭代器模式概述
|
|||
|
遍历在日常编码过程中经常使用,通常是需要对一个具有很多对象实例的集合(称为**聚合对象**)进行访问或获取。比如要取聚合对象的首位元素、判断是否在聚合对象的末尾等。针对聚合对象的遍历,迭代器模式是一种很有效的解决方案,也是一种使用频率很高的设计模式。
|
|||
|
```
|
|||
|
迭代器模式:
|
|||
|
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
|
|||
|
```
|
|||
|
通过引入迭代器,可以将数据的遍历功能从聚合对象中分离出来,这样一来,聚合对象只需负责存储数据,而迭代器对象负责遍历数据,使得聚合对象的职责更加单一,符合单一职责原则。
|
|||
|
## 2.迭代器模式结构
|
|||
|
迭代器模式结构中包含聚合和迭代器两个层次的结构。为方便扩展,迭代器模式常常和工厂方法模式结合。迭代器模式的UML图如下。有图可知,迭代器模式有以下几个角色:
|
|||
|
- **Iterator(抽象迭代器)**:声明了访问和遍历聚合对象元素的接口,如first()方法用于访问聚合对象中第一个元素,next()方法用于访问下一个元素,hasNext()判断是否还有下一个元素,currentItem()方法用于获取当前元素。
|
|||
|
- **ConcreteIterator(具体迭代器)**:实现抽象迭代器声明的方法,通常具体迭代器中会专门用一个变量(称为游标)来记录迭代器在聚合对象中所处的位置。
|
|||
|
- **Aggregate(抽象聚合类)**:用于存储和管理元素对象,声明一个创建迭代器的接口,其实是一个抽象迭代器工厂的角色。
|
|||
|
- **ConcreteAggregate(具体聚合类)**:实现了方法createIterator(),该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator的实例。
|
|||
|
|
|||
|
![avatar](https://github.com/FengJungle/DesignPattern/blob/master/16.InterpreterPattern/1.Picture/%E5%BC%95%E8%A8%80.png)
|