迭代器模式

  • 1.定义
  • 2.迭代器模式的相关组成
    • 抽象聚合类
    • 具体聚合类
    • 抽象迭代器类
    • 具体迭代器类
  • 3.代码实现
    • 运行结果演示
  • 4.优缺点

1.定义

提供一种顺序访问集合内元素的方法,但不暴露集合内部实现细节的设计模式,属于行为型设计模式.
迭代器模式将数据的存储和遍历相分离,存储交给聚合类,遍历交给迭代器类,如果需要对新的集合进行顺序遍历,只需要扩展新的迭代器类和聚合类。

2.迭代器模式的相关组成

抽象聚合类

提供一个创建迭代器对象的接口、添加元素接口、删除元素接口

具体聚合类

根据存储元素方式的不同,重写创建迭代器接口,返回自己对应的迭代器
并重写添加元素和删除元素接口
具体聚合类和具体迭代器类是互相对应的

抽象迭代器类

提供一种可以查看集合中是否有下一个元素和走到集合的下一个元素位置的接口

具体迭代器类

为具体聚合类实现对应的接口,因为不同聚合类内部存储元素的方式可能不同

3.代码实现

#include <iostream>
#include <string>
#include <vector>
#include <list>using namespace std;//学生类
//集合中存储的元素类型
class Student
{public:string _name;            //姓名string _stuNo;          //学号string _college;        //学院
public:Student(const string& name, const string& stuNo, const string& college):_name(name), _stuNo(stuNo), _college(college){}//展示学生信息void showInfo(){cout << "姓名: " << _name << "\t学号: " << _stuNo << "\t学院: " << _college << endl;}
};//抽象迭代器
class Iterator
{public://下一个位置是否有元素virtual bool hasNext() = 0;//返回当前元素,并且走到下一个位置virtual Student next() = 0;
};//计算机学院迭代器
class ComputerIterator : public Iterator
{private:vector<Student> _info;        //迭代器访问的数据集合int _curPos;                //当前访问的下标位置
public:ComputerIterator(const vector<Student>& info):_info(info), _curPos(0){}//下一个位置是否有元素virtual bool hasNext(){return _curPos < _info.size();}//返回当前元素,并且走到下一个位置virtual Student next(){Student curStu = _info[_curPos++];return curStu;}
};//体育学院迭代器
//因为内部存储数据的容器是list
//为了不使用STL提供的迭代器,所以遍历的顺序是从链表的头部到尾部
//每次访问元素之后会删除链表头部元素
class SportIterator : public Iterator
{private:list<Student> _info;      //迭代器访问的数据集合
public://下一个位置是否有元素virtual bool hasNext(){return !_info.empty();}//返回当前元素,并且走到下一个位置virtual Student next(){Student front = _info.front();_info.pop_front();return front;}SportIterator(const list<Student>& info):_info(info){}
};//抽象聚合类
class Aggregate
{public://添加学生信息virtual void addStudent(const Student& stu) = 0;//删除学生信息virtual void deleteStudent(const Student& stu) = 0;//创建迭代器virtual Iterator* createIterator() = 0;
};//计算机学院聚合类
class ComputerAggregate : public Aggregate
{private:vector<Student> _info;        //学生信息数据管理器public://添加学生信息virtual void addStudent(const Student& stu){_info.emplace_back(stu);}//删除学生信息virtual void deleteStudent(const Student& stu){auto it = _info.begin();while (it != _info.end()){if (it->_name == stu._name && it->_stuNo == stu._stuNo && it->_college == stu._college){break;}++it;}_info.erase(it);}//创建迭代器virtual Iterator* createIterator(){return new ComputerIterator(_info);}
};//体育学院聚合类
class SportAggregate : public Aggregate
{private:list<Student> _info;      //存储学生对象的集合
public://添加学生信息virtual void addStudent(const Student& stu){_info.push_back(stu);}//删除学生信息virtual void deleteStudent(const Student& stu){auto it = _info.begin();while (it != _info.end()){if (it->_name == stu._name && it->_stuNo == stu._stuNo && it->_college == stu._college){break;}++it;}_info.erase(it);}//创建迭代器virtual Iterator* createIterator(){return new SportIterator(_info);}
};//计算机学院测试
void test_College()
{Aggregate* computerCollege = new ComputerAggregate();computerCollege->addStudent(Student("索隆", "11", "计算机"));computerCollege->addStudent(Student("红发香克斯", "12", "计算机"));computerCollege->addStudent(Student("路飞", "13", "计算机"));computerCollege->addStudent(Student("娜美", "14", "计算机"));computerCollege->addStudent(Student("山治", "15", "计算机"));Iterator* it = computerCollege->createIterator();cout << "*************   计算机学院   **************" << endl;while (it->hasNext()){it->next().showInfo();}
}//体育学院测试
void test_Sport()
{Aggregate* sportCollege = new SportAggregate();sportCollege->addStudent(Student("白胡子", "0", "体育"));sportCollege->addStudent(Student("雷利", "1", "体育"));sportCollege->addStudent(Student("罗杰", "2", "体育"));sportCollege->addStudent(Student("凯多", "3", "体育"));sportCollege->addStudent(Student("黑胡子", "4", "体育"));sportCollege->addStudent(Student("BigMom", "5", "体育"));Iterator* it = sportCollege->createIterator();cout << "*************   体育学院   **************" << endl;while (it->hasNext()){it->next().showInfo();}
}int main()
{test_College();cout << "\n\n\n\n" << endl;test_Sport();return 0;
}

运行结果演示

4.优缺点

优点:
符合开闭原则,如果需要对新的元素集合进行遍历,只需要添加新的具体聚合类和具体迭代器类;
支持在同一个集合上采用不同的遍历方式;
缺点:
对新集合进行遍历需要增加一个具体聚合类和一个具体迭代器类,造成类的个数增加

迭代器模式(C++实现)相关推荐

  1. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 设计模式笔记(18)---迭代器模式(行为型)

    Gof定义 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露该对象的内部表示. 动机 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可 ...

  3. 21Iterator(迭代器)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Iterator(迭代器)模式动机 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以 ...

  4. 迭代器模式(Iterator pattern)

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); w ...

  5. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  6. 设计模式学习总结-迭代器模式(Iterator Pattern)

    问题: 在面向对象的软件设计中,经常会遇到一些聚集对象,按一定的顺序的遍历访问问题,这个遍历算法究竟应该由谁来实现呢,聚集对象本身?这样聚集对象承受了过多的功能,不仅要维护聚集对象内的元素,还要提供遍 ...

  7. 结合项目实例 回顾传统设计模式(九)迭代器模式

    关于迭代器模式,我们所需要知道的第一件事情就是它依赖于一个名为迭代器的接口.一旦我们有了这个接口,就可以为各种那个对象集合实现迭代器:数组.列表.散列表. 项目实例我们就拿用户角色模块来举例 背景 1 ...

  8. java迭代器的使用场景_集合遍历利器 -- 迭代器模式 介绍 使用场景案例 优缺点及程序演示...

    一句话概括: 顺序访问集合对象的元素,不需要知道集合对象的底层表示. 补充介绍: 迭代器模式(Iterator Pattern)相信大家都已经见过不少次了,当你学习Java或者其他编程语言的开始你就会 ...

  9. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  10. 设计模式学习笔记(八:迭代器模式)

    1.1概述 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露对象的内部表示.这就是迭代器模式的定义. 合理组织数据的结构以及相关操作是程序设计的一个重要方面,比如在程序设计中经常会使用诸如 ...

最新文章

  1. 亲身经历,在实验室不要乱按按钮!!
  2. Podman中如何运行一个 Linux 虚拟机?
  3. 从青年基金到面上项目
  4. 纯文本文件的字符编码未声明_浅谈几种常见的字符编码
  5. Oracle经典教程学习笔记
  6. Redis源代码分析-内存数据结构intset
  7. 第四范式连续两年入选CB Insights全球AI百强榜
  8. MVC3快速搭建Web应用(二)
  9. JDBC 数据库连接操作——实习第三天
  10. Python html 代码转成 word(docx)
  11. 代码更换ui图片_不同人眼中的UI设计师都是什么样的?
  12. MS DOS窗口进入JAVA源程序,从java程序运行MS-DOS命令
  13. net view命令执行时,提示服务没有启动。
  14. Pr 入门教程,如何在节目监视器中修剪剪辑?
  15. 斐讯k2修改dns服务器,斐讯K2固件修改的一些信息
  16. Vue动态渲染本地图片
  17. Sepic电路的参数计算及仿真
  18. java每日打卡_“365算法每日学计划”:03打卡-贪心算法
  19. execve系统调用_execve系统调用分析
  20. 2021 ICPC Southeastern Europe Regional Contest 树上dfs+思维

热门文章

  1. 计算机网络基础(2)----协议数据单元(PDU)以及一些基本概念的区分
  2. Loadrunner进行手机APP压力测试(亲测可行)
  3. Scratch《侠盗飞车》游戏源码.sb文件
  4. 《深入浅出DPDK》全书在线阅读(附录+推荐阅读)
  5. SqlDataSource的Selecting事件使用心得
  6. 关于int取值范围的问题
  7. 【Photoshop】修人像的一些操作记录
  8. 【青龙2.13依赖安装失败修复】ERR_PNPM_REGISTRIES_MISMATCH This modules directory was created using ...
  9. IA64Linux内核,关于amd64和ia64的理解
  10. 一张图看看我的iPhone小圆点AssistiveTouch设置和布局技巧