为什么要在JAVA,C++等集合中引入迭代器
2015-10-26 18:39
344 查看
迭代模式是访问集合类的通用方法,只要集合类实现了Iterator接口,就可以用迭代的方式来访问集合类内部的数据,Iterator访问方式把对不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
这种方法的缺点就是事先必须知道集合的数据结构,而且当我换了一种集合的话代码不可重用,要修改,比如我用set,就不能通过索引来遍历了。访问代码和集合是紧耦合,无法将访问逻辑从集合类和客户端代码中剥离出来,每一种集合类对应一种访问方式,代码不可重用。
为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合。
每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree 可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个 Iterator接口即可,这就是面向对象的威力。
这就是针对抽象编程的原则:对具体类的依赖性最小。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.length; i++) { ... get(i) ... }
这种方法的缺点就是事先必须知道集合的数据结构,而且当我换了一种集合的话代码不可重用,要修改,比如我用set,就不能通过索引来遍历了。访问代码和集合是紧耦合,无法将访问逻辑从集合类和客户端代码中剥离出来,每一种集合类对应一种访问方式,代码不可重用。
为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合。
每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree 可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个 Iterator接口即可,这就是面向对象的威力。
这就是针对抽象编程的原则:对具体类的依赖性最小。
相关文章推荐
- 逆波兰表达式C++代码实现
- 值得推荐的C/C++框架和库 (真的很强大)
- 进击的KFC第七节:C语言:结构体篇
- C++模板
- C++:默认的构造函数
- C++ 使用ProtoBuffer 心得
- C++:对象声明
- C++:对象的初始化和构造函数
- C语言之单位下三角矩阵求逆
- C++:类的成员函数定义方式
- 20 issues of porting C++ code on the 64-bit platform
- C++:类的创建
- C++:this指针
- C++:String类
- C++:对象指针
- C++学习笔记6 - 分支语句和逻辑运算符
- C++:对象数组
- 日志库EasyLogging++学习系列(4)—— 格式说明符
- typedef和struct结合
- CUDAExample-0-cppIntegration