迭代器模式

来源:互联网 发布:java观察者设计模式 编辑:程序博客网 时间:2024/05/20 13:14

概念

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 又叫做游标(cursor)模式

适用场景

1. 访问一个聚合对象的内容而无需暴露它的内部表示
2. 需要为聚合对象提供多种遍历方式
3. 为遍历不同的聚合结构提供统一个统一的接口

结构


抽象迭代器(Iterator): 定义访问和遍历的接口
具体迭代器(ConcreteIterator): 实现抽象迭代器的接口, 对具体聚合结构实现遍历并跟踪当前位置
抽象聚合(Aggregate): 定义创建响应迭代器的接口
具体聚合(ConcreteAggregate): 实现createIterator接口, 返回一个ConcreteIterator的一个实例

优缺点

优点:

1. 提供一种方法, 可以顺序访问聚合对象中的每个元素,而又不暴露其内部表示
2. 把在元素之间游走的责任交给迭代器,而不是聚合对象.这不仅让聚合的接口和实现变得更简洁,也可以让聚合更专注在它所应该专注的事情上面(也就是管理对象集合),而不必去理会遍历的事情
3. 在同一个集合上可以有多个遍历,每个迭代器保持它自己的遍历状态, 因此你可以同时进行多个遍历
4. 在迭代器模式中, 增加新的聚合类和迭代器都很方便, 无须修改原有代码, 满足"开闭原则"的要求
5. 支持以不同方式遍历一个聚合对象, 复杂的聚合可用多种方式进行遍历, 迭代器模式使得改变遍历算法变得容易,仅需用一个不同的迭代器的实例代替原先的实例即可,也可以自己定义迭代器的子类以支持新的遍历


c++中的容器与迭代器

在c++的stl中, 容器都是类模板, 为了实现这种迭代器模式, c++的做法与上述稍有区别
1. c++中的迭代器并没有采用继承而形成一个体系, 而是使用了嵌套类, 在容器类中分别定义了名为iterator, const_iterator, reverse_iterator, const_reverse_iterator等类,在需要获取迭代器时, 使用container<type>::iterator = object.begin();等方式获取指向第一个元素的迭代器, 使用object.end();返回指向尾后元素的迭代器, 而这些迭代器都支持+,-, ++, --操作, 用来进行移动.
2. 由于每个容器的迭代器的名字都一样, 因此可以方便的进行容器的替换, 而不影响原有代码
3. 由于c++容器的迭代器没有一个顶层基类, 它们属于不同的类. 不同模板类是不同的互不相关的类型, 因此他们的嵌套类也是互不想关的类型, 如std::vector<int>::iterator 和std::vector<double>::iterator之间没有任何关系, 因此不能使用相同的类型来指代他们.





原创粉丝点击