首页 > 其他 > 详细

[设计模式] 设计模式课程(十八)--迭代器模式

时间:2020-06-08 15:58:14      阅读:34      评论:0      收藏:0      [点我收藏+]

概述

  • 属于行为型模式
  • 将集合的遍历行为抽取为单独的迭代器对象
  • 所有迭代器实现相同的接口,只要有合适的迭代器,客户端代码就能兼容任何类型的集合或遍历算法,如需采用特殊方法遍历集合,创建一个新的迭代器即可,而无需对集合或客户端进行修改
  • 集合对象内部结构常常变化各异,但对于这些集合对象,我们希望在不暴露其内部结构的同时,也可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能
  • 使用面向对象技术将这种遍历机制抽象为“迭代器模式”为“因对变化中的集合对象”提供了一种优雅的方式
  • 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露(稳定)该对象内部的表示
  • 通过迭代器接口,隔离算法和容器之间的变化
  • 面向对象(虚函数)实现迭代器,虚函数调用存在性能问题(运行时多态),在迭代器循环中会造成较大损失(绕虚函数表指针找函数地址的运算),故在c++在98年后改用STL泛型编程模板实现迭代器(编译时多态)
  • Java、C#类库中依然使用面向对象实现迭代器
  • 迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示
  • 迭代多样:为遍历不同的集合提供一个统一的接口,从而支持同样的算法在不同集合结构上进行操作
  • 健壮性:迭代的同时更改迭代器所在的集合结构,会导致问题
  • ConcreteAggregate是具体聚合类(容器,如列表(List)或集合(Set)等),ConcreteIterator是容器对应的迭代器类

技术分享图片

场景

  • 采用自由行,手机导航,跟团等方式游览一个城市,城市的景点是一个集合,每个游览方式是一个迭代器

结构

技术分享图片

 

  • 迭代器接口:声明了遍历集合所需的操作
  • 具体迭代器类:实现遍历集合的一种特定算法
  • 集合接口:声明一个或多个方法获取与集合兼容的迭代器,返回迭代器接口
  • 具体集合类:客户端请求迭代器时返回一个特定的具体迭代器类实体
  • 客户端类:通过集合和迭代器接口与两者进行交互

示例

Iterator.cpp

技术分享图片
 1 template<typename T>
 2 class Iterator
 3 {
 4 public:
 5     virtual void first() = 0;
 6     virtual void next() = 0;
 7     virtual bool isDone() const = 0;
 8     virtual T& current() = 0;
 9 };
10 
11 template<typename T>
12 class MyCollection{
13     
14 public:
15     
16     Iterator<T> GetIterator(){
17         //...
18     }
19     
20 };
21 
22 template<typename T>
23 class CollectionIterator : public Iterator<T>{
24     MyCollection<T> mc;
25 public:
26     
27     CollectionIterator(const MyCollection<T> & c): mc(c){ }
28     
29     void first() override {
30         
31     }
32     void next() override {
33         
34     }
35     bool isDone() const override{
36         
37     }
38     T& current() override{
39         
40     }
41 };
42 
43 void MyAlgorithm()
44 {
45     MyCollection<int> mc;
46     
47     Iterator<int> iter= mc.GetIterator();
48     
49     for (iter.first(); !iter.isDone(); iter.next()){
50         cout << iter.current() << endl;
51     }
52     
53 }
View Code

技术分享图片

 

参考

迭代器模式c++实现

https://blog.csdn.net/u012611878/article/details/78010435

CSDN:MachineChen

[设计模式] 设计模式课程(十八)--迭代器模式

原文:https://www.cnblogs.com/cxc1357/p/12320383.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!