当前位置: 首页 > news >正文

【设计模式之迭代器模式 -- C++】

迭代器模式 – 遍历集合,无需暴露

迭代器模式是一种设计模式,用于顺序访问集合对象的元素,而无需暴露其底层实现。迭代器模式分离了集合对象的遍历行为,使得访问元素时,可以不必了解集合对象的底层实现。

组成
  1. 迭代器(Iterator)接口:定义访问和遍历元素的接口,通常会有方法如next(), hasNext(), remove()等。
  2. 具体迭代器(Concrete Iterator)类:实现迭代器接口,负责管理遍历集合中的元素。
  3. 集合(Collection)接口:定义创建迭代器对象的接口,允许返回一个可以遍历自身元素的迭代器。
  4. 具体集合(Concrete Collection)类:实现集合接口,当需要遍历该集合的元素时,会创建一个具体的迭代器实例。
优点
  1. 支持多态迭代:迭代器模式允许使用相同的接口遍历不同的集合,支持多态迭代。
  2. 简化集合接口:迭代器承担了遍历集合的职责,简化了集合的接口和实现。
  3. 解耦集合对象与遍历逻辑:使用迭代器模式可以分离集合对象和遍历逻辑,使得两者的修改更加独立。
应用场景
  1. 当你需要访问一个集合对象的内容而无需暴露其内部表示时。
  2. 当你需要对集合有多种遍历方式时。
  3. 当你需要为遍历不同的集合提供一个统一的接口时。
实现
  1. 实现迭代器接口
class Iterator {
public:virtual int next() = 0;virtual bool hasNext() = 0;
};
  1. 具体迭代器实现
class ConcreteIterator : public Iterator {
private:std::vector<int> data;int position;public:ConcreteIterator(const std::vector<int>& data) : data(data), position(0) {}int next() override {return data[position++];}bool hasNext() override {return position < data.size();}
};
  1. 容器接口和具体实现
class Container {
public:virtual Iterator* createIterator() = 0;
};// 具体容器实现
class ConcreteContainer : public Container {
private:std::vector<int> data;public:void add(int value) {data.push_back(value);}Iterator* createIterator() override {return new ConcreteIterator(data);}
};
  1. 测试
int main() {ConcreteContainer container;container.add(1);container.add(2);container.add(3);Iterator* iterator = container.createIterator();while (iterator->hasNext()) {std::cout << iterator->next() << " ";}std::cout << std::endl;delete iterator;return 0;
}
  1. 结果
1 2 3 

相关文章:

  • web安全渗透测试十大常规项(一):web渗透测试之PHP反序列化
  • CentOS 7 内核 3.10 升级 6.5.2 (RPM 直装 + 源码编译)
  • 新建一个 React TypeScript 项目,并使用 Webpack 进行构建和打包
  • Java程序之让气球上升
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用
  • git配置ssh key
  • tensorRT C++使用pt转engine模型进行推理
  • express+vue 在线五子棋(一)
  • 使用Vue开发页面(前置知识)
  • npm全局安装依赖指定存放文件目录
  • 电子电气架构——由NRC优先级引起的反思
  • 华为appgallery上架
  • 借助AI快速提高英语听力:如何获得适合自己的听力材料?
  • Python爬虫介绍
  • 2024 年值得推荐的 10 款 iPhone 数据恢复软件
  • 自己简单写的 事件订阅机制
  • 0基础学习移动端适配
  • Android 控件背景颜色处理
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • bootstrap创建登录注册页面
  • C# 免费离线人脸识别 2.0 Demo
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • C语言笔记(第一章:C语言编程)
  • Java多态
  • java正则表式的使用
  • nginx 配置多 域名 + 多 https
  • oschina
  • overflow: hidden IE7无效
  • Vue.js 移动端适配之 vw 解决方案
  • 安卓应用性能调试和优化经验分享
  • 测试如何在敏捷团队中工作?
  • 彻底搞懂浏览器Event-loop
  • 聊一聊前端的监控
  • 深度学习中的信息论知识详解
  • 使用parted解决大于2T的磁盘分区
  • 通过git安装npm私有模块
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 你对linux中grep命令知道多少?
  • python最赚钱的4个方向,你最心动的是哪个?
  • 选择阿里云数据库HBase版十大理由
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #{}和${}的区别是什么 -- java面试
  • #WEB前端(HTML属性)
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (zhuan) 一些RL的文献(及笔记)
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (十一)手动添加用户和文件的特殊权限
  • (四)图像的%2线性拉伸
  • (五)关系数据库标准语言SQL
  • (一)UDP基本编程步骤
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)