迭代器模式(Iterator Pattern)

简介: 迭代器模式是一种行为型设计模式,用于提供一种顺序访问集合对象元素的方法,而不暴露集合的内部表示。通过迭代器模式,用户可以独立于集合的实现来遍历集合。适用于需要以一致方式遍历不同类型集合的场景,分离集合的遍历逻辑和集合的实现,增强灵活性。但需注意迭代器的内存开销。

迭代器模式(Iterator Pattern)详解

1. 定义

迭代器模式是一种行为型设计模式,用于提供一种顺序访问集合对象元素的方法,而不暴露集合的内部表示。通过迭代器模式,用户可以独立于集合的实现来遍历集合。

通俗解释:

迭代器就像一份菜单上的翻页工具,它不关心菜单的内容是如何存储的,只负责让顾客按顺序查看菜单上的菜品。


2. 使用场景

使用场景 描述
需要顺序访问集合中的元素 集合的内部结构可能复杂,但需要对其元素进行简单遍历。
屏蔽集合内部实现细节 用户不关心集合是数组、链表还是其他数据结构,只关注遍历功能。
统一不同集合的遍历方式 对不同集合提供统一的遍历接口,提升代码的通用性和灵活性。

3. 迭代器模式的优缺点

特性 优点 缺点
封装性 用户无需了解集合的内部结构。 为每种集合类型实现迭代器类可能会增加代码量。
灵活性 可以轻松替换集合实现,不影响遍历逻辑。 对于特别大的集合,迭代器可能带来额外的内存开销。
统一接口 使遍历操作对用户透明。 单一责任原则冲突:迭代器承担遍历和状态管理职责。

4. 迭代器模式的组成

  1. 迭代器接口
    定义访问和遍历集合元素的方法(如 FirstNextIsDoneCurrentItem)。
  2. 具体迭代器
    实现迭代器接口,维护遍历的状态(如当前索引)。
  3. 集合接口
    定义一个方法,返回迭代器对象。
  4. 具体集合
    实现集合接口,返回具体迭代器实例。

5. 使用案例

示例描述:

一个音乐播放应用中,有“播放列表”,它可以包含不同类型的集合(如数组、链表)。迭代器模式可用于统一遍历这些集合,不论内部结构如何。


C++ 示例

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// 迭代器接口
template <typename T>
class Iterator {
public:
   virtual ~Iterator() {}
   virtual T next() = 0;       // 返回下一个元素
   virtual bool hasNext() = 0; // 是否还有更多元素
};

// 具体迭代器
template <typename T>
class PlaylistIterator : public Iterator<T> {
   vector<T>& playlist;
   size_t index = 0;
public:
   PlaylistIterator(vector<T>& playlist) : playlist(playlist) {}

   T next() override {
       return playlist[index++];
   }

   bool hasNext() override {
       return index < playlist.size();
   }
};

// 集合接口
template <typename T>
class Aggregate {
public:
   virtual ~Aggregate() {}
   virtual Iterator<T>* createIterator() = 0; // 创建迭代器
};

// 具体集合
template <typename T>
class Playlist : public Aggregate<T> {
   vector<T> songs;
public:
   void addSong(const T& song) {
       songs.push_back(song);
   }

   Iterator<T>* createIterator() override {
       return new PlaylistIterator<T>(songs);
   }
};

// 客户端代码
int main() {
   Playlist<string> playlist;
   playlist.addSong("Song A");
   playlist.addSong("Song B");
   playlist.addSong("Song C");

   Iterator<string>* iterator = playlist.createIterator();
   while (iterator->hasNext()) {
       cout << "Playing: " << iterator->next() << endl;
   }

   delete iterator;
   return 0;
}


C# 示例

using System;
using System.Collections.Generic;

// 迭代器接口
public interface IIterator<T> {
   T Next();          // 返回下一个元素
   bool HasNext();    // 是否还有更多元素
}

// 具体迭代器
public class PlaylistIterator<T> : IIterator<T> {
   private readonly List<T> _playlist;
   private int _index = 0;

   public PlaylistIterator(List<T> playlist) {
       _playlist = playlist;
   }

   public T Next() {
       return _playlist[_index++];
   }

   public bool HasNext() {
       return _index < _playlist.Count;
   }
}

// 集合接口
public interface IAggregate<T> {
   IIterator<T> CreateIterator(); // 创建迭代器
}

// 具体集合
public class Playlist<T> : IAggregate<T> {
   private readonly List<T> _songs = new();

   public void AddSong(T song) {
       _songs.Add(song);
   }

   public IIterator<T> CreateIterator() {
       return new PlaylistIterator<T>(_songs);
   }
}

// 客户端代码
class Program {
   static void Main() {
       Playlist<string> playlist = new();
       playlist.AddSong("Song A");
       playlist.AddSong("Song B");
       playlist.AddSong("Song C");

       IIterator<string> iterator = playlist.CreateIterator();
       while (iterator.HasNext()) {
           Console.WriteLine("Playing: " + iterator.Next());
       }
   }
}


迭代器模式的类图


6. 迭代器模式与其他模式对比

特性 迭代器模式 组合模式
核心作用 提供顺序访问集合的方式 组织对象成树状结构以表现整体-部分关系
封装性 封装集合内部结构 封装整体和部分的操作
使用场景 对集合进行遍历 处理树状结构(如文件系统)
是否依赖集合结构 不依赖具体集合结构,支持多种集合类型 通常依赖于树状集合结构

总结

  • 适用场景: 当需要以一致的方式遍历不同类型集合时,可以使用迭代器模式。
  • 优点: 分离集合的遍历逻辑和集合的实现,增强灵活性。
  • 注意事项: 对于性能敏感的场景,需注意迭代器的内存开销。
相关文章
|
数据中心
|
存储 数据处理
什么是迭代,什么是可迭代对象
什么是迭代,什么是可迭代对象
925 1
|
数据采集 小程序 数据可视化
智慧校园电子班牌管理系统源码 Java Android原生
家长通过家长小程序端随时了解孩子在校的情况,实时接收学生的出勤情况,学生到校、离校时间。随时了解学生在校的表现、学生成绩排名,及时与教师沟通,关注孩子的健康成长。
286 0
智慧校园电子班牌管理系统源码 Java Android原生
|
2月前
|
人工智能 网络协议 JavaScript
阿里云OpenClaw(Clawdbot)一键部署图文指南:快速拥有专属AI助手!
本文发布于2026年2月,基于阿里云最新官方方案,面向零基础用户,提供OpenClaw(原Clawdbot/Moltbot)一键部署全流程——30分钟即可搭建7×24小时在线、隐私可控的本地化AI智能体,支持文件管理、日程调度、代码编写与跨应用协同,年费仅约68元。
2281 2
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
412 0
|
11月前
|
设计模式 存储 Java
【设计模式】【行为型模式】备忘录模式(Memento)
一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
351 8
|
设计模式 C# C++
责任链模式(Chain of Responsibility Pattern)
责任链模式是一种行为型设计模式,允许多个对象按顺序处理请求,直到某个对象处理为止。适用于多个对象可能处理同一请求的场景,如请假审批流程。优点是灵活性高、降低耦合,但责任链过长可能影响性能。
|
11月前
|
设计模式 存储 JavaScript
【设计模式】【行为型模式】迭代器模式(Iterator)
一、入门 什么是迭代器模式? 迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出
291 11
|
人工智能 安全 搜索推荐
重大技术突破!阿里云无影获“2024算力中国·年度重大成果”奖
重大技术突破!阿里云无影获“2024算力中国·年度重大成果”奖
612 3
|
设计模式 API C#
桥接模式(Bridge Pattern)
桥接模式是一种结构型设计模式,通过将抽象部分与实现部分分离,使它们可以独立变化,从而提高系统的灵活性和扩展性。主要角色包括抽象化、扩展抽象化、实现和具体实现。适用于多变化维度的系统,如跨平台开发、图形系统等。优点是分离抽象与实现,减少子类数量;缺点是增加了复杂性和理解难度。
下一篇
开通oss服务