迭代器模式(Iterator Pattern)

发布时间:2026/5/26 19:56:56

迭代器模式(Iterator Pattern) C 迭代器模式Iterator Pattern一、模式基础概述1.1 定义迭代器模式属于行为型设计模式提供统一遍历接口以顺序方式访问聚合容器内所有元素全程不对外暴露容器内部存储结构、数据组织形式。将遍历逻辑与容器存储逻辑解耦遵循单一职责原则。1.2 核心思想剥离集合自身的遍历行为单独封装迭代器对象负责元素访问客户端仅通过标准接口遍历数据无需关心底层是数组、链表、树形等存储结构。1.3 设计原则单一职责容器负责数据存储增删迭代器负责遍历访问迪米特法则隐藏内部结构降低外部与容器耦合度开闭原则新增遍历方式只需新增迭代器不改动容器代码二、核心组成角色角色名称核心职责C 实现形式抽象迭代器 Iterator声明通用遍历接口判断是否存在下一元素、获取当前元素抽象模板基类纯虚函数定义接口具体迭代器 ConcreteIterator实现遍历接口记录遍历游标位置关联聚合容器完成实际遍历继承抽象迭代器重写遍历方法抽象聚合容器 Aggregate定义创建迭代器的统一接口规范容器基础操作抽象基类声明创建迭代器函数具体聚合容器 ConcreteAggregate存储实际元素实现创建迭代器方法提供元素查询、新增能力继承抽象聚合内部维护数据集合客户端 Client通过迭代器遍历元素调用标准接口完成访问业务调用代码、主函数三、模式运行流程客户端创建具体聚合容器并向容器添加业务元素调用容器接口生成专属迭代器实例客户端循环调用迭代器判断接口校验是否还有未遍历元素存在元素则获取当前元素并移动遍历游标遍历结束后终止访问整个过程不直接操作容器内部数据四、经典业务示例书架书籍遍历#includeiostream#includevector#includestring#includememory// 元素实体书籍classBook{private:std::string bookName;public:Book(std::string name):bookName(std::move(name)){}std::stringgetName()const{returnbookName;}};// 抽象迭代器模板templatetypenameTclassIterator{public:virtual~Iterator()default;virtualboolhasNext()const0;virtualTnext()0;};// 抽象聚合容器模板templatetypenameTclassAggregate{public:virtual~Aggregate()default;virtualstd::unique_ptrIteratorTcreateIterator()const0;virtualvoidaddElement(constTelem)0;virtualintgetSize()const0;virtualTgetElement(intindex)const0;};// 具体容器书架classBookShelf:publicAggregateBook{private:std::vectorBookbookList;public:voidaddElement(constBookelem)override{bookList.push_back(elem);}intgetSize()constoverride{returnbookList.size();}BookgetElement(intindex)constoverride{returnbookList[index];}std::unique_ptrIteratorBookcreateIterator()constoverride;};// 具体迭代器书架迭代器classBookShelfIterator:publicIteratorBook{private:constBookShelf*shelf;intcurrentIndex;public:BookShelfIterator(constBookShelf*shelfObj):shelf(shelfObj),currentIndex(0){}boolhasNext()constoverride{returncurrentIndexshelf-getSize();}Booknext()override{returnshelf-getElement(currentIndex);}};// 容器绑定迭代器std::unique_ptrIteratorBookBookShelf::createIterator()const{returnstd::make_uniqueBookShelfIterator(this);}// 客户端调用intmain(){BookShelf shelf;shelf.addElement(Book(C设计模式));shelf.addElement(Book(数据结构与算法));shelf.addElement(Book(Linux编程实战));autoiteratorshelf.createIterator();std::cout书架内书籍列表\n;while(iterator-hasNext()){Book bookiterator-next();std::coutbook.getName()std::endl;}return0;}五、通用模板示例自定义任务容器遍历#includeiostream#includevector#includememory// 通用抽象迭代器templatetypenameTclassBaseIterator{public:virtual~BaseIterator()default;virtualboolexistNext()0;virtualTfetchNext()0;};// 通用抽象容器templatetypenameTclassBaseContainer{public:virtual~BaseContainer()default;virtualstd::unique_ptrBaseIteratorTgetIterator()0;virtualvoidappend(constTdata)0;virtualsize_tgetLength()const0;virtualTgetData(size_t idx)const0;};// 线性存储容器templatetypenameTclassLinearContainer:publicBaseContainerT{private:std::vectorTdataArr;public:voidappend(constTdata)override{dataArr.push_back(data);}size_tgetLength()constoverride{returndataArr.size();}TgetData(size_t idx)constoverride{returndataArr[idx];}std::unique_ptrBaseIteratorTgetIterator()override;};// 线性容器迭代器templatetypenameTclassLinearIterator:publicBaseIteratorT{private:LinearContainerT*container;size_t cursor;public:LinearIterator(LinearContainerT*con):container(con),cursor(0){}boolexistNext()override{returncursorcontainer-getLength();}TfetchNext()override{returncontainer-getData(cursor);}};templatetypenameTstd::unique_ptrBaseIteratorTLinearContainerT::getIterator(){returnstd::make_uniqueLinearIteratorT(this);}// 测试使用intmain(){LinearContainerstd::stringtaskContainer;taskContainer.append(路径规划);taskContainer.append(环境检测);taskContainer.append(设备自检);autoitertaskContainer.getIterator();std::cout\n机器人任务清单\n;while(iter-existNext()){std::coutiter-fetchNext()std::endl;}return0;}六、迭代器分类说明外部迭代器客户端主动控制遍历启停、游标移动日常开发最常用。内部迭代器迭代器自身完成全部遍历逻辑客户端仅发起遍历请求。正向迭代器仅支持从头部向尾部单向遍历。双向迭代器可前后移动游标支持正反遍历元素。随机访问迭代器支持下标取值、游标跳跃访问访问效率最高。七、与C STL迭代器关联STL容器遍历是迭代器模式工业化落地实现begin()、end()等同于创建迭代器对象、--运算符实现游标移动*解引用运算符获取容器元素统一遍历接口vector、list、map可复用遍历代码#includeiostream#includevectorintmain(){std::vectorintnumVec{10,20,30,40};// STL标准迭代器用法for(autoitnumVec.begin();it!numVec.end();it){std::cout*it ;}return0;}八、模式优缺点8.1 优点统一遍历接口适配多种异构容器遍历代码可复用屏蔽容器底层存储细节提升数据安全性存储与遍历职责拆分代码结构清晰易维护可同时创建多个迭代器并行遍历同一容器灵活扩展遍历方式正序、倒序、过滤遍历互不影响8.2 缺点每新增一种容器需配套编写对应迭代器类类数量增加极简小型集合使用该模式存在代码冗余、过度设计遍历过程中修改容器结构容易引发迭代器失效问题九、适用业务场景项目存在多种不同存储结构的集合需要统一遍历方式要求隐藏容器内部数据组织禁止外部直接访问底层结构同一集合需要提供多种遍历规则、访问顺序分离数据存储与遍历逻辑降低模块间耦合任务队列、数据集、地图节点、日志条目遍历场景十、相近模式区分模式核心作用侧重点迭代器模式统一访问集合元素容器遍历、隐藏内部结构组合模式统一处理树形整体与节点层级递归遍历对象访问者模式在不修改类前提下新增操作对元素执行自定义业务操作十一、C工程编码规范使用std::unique_ptr管理迭代器实例自动回收内存迭代器仅做元素访问不修改容器内部数据与结构遍历周期内避免增删元素防止迭代器失效崩溃常规业务优先使用STL原生迭代器自定义特殊容器再手写迭代器抽象接口精简通用保证不同迭代器调用规则一致十二、模式总结迭代器模式核心是访问分离、结构隐藏、接口统一。通过独立迭代器接管遍历逻辑让容器专注数据存储客户端以通用方式读取元素无需感知底层实现。该模式是C容器体系的基础设计思想广泛应用于数据遍历、任务处理、集合管理等业务场景有效简化多容器兼容开发成本。

相关新闻