【C++设计模式之迭代器模式】分析及示例

简介

迭代器模式是一种行为型设计模式,它提供了一种顺序访问聚合对象元素的方法,而又不需要暴露聚合对象的内部结构。迭代器模式通过将遍历算法封装在迭代器对象中,可以使得遍历过程更简洁、灵活,并且符合开闭原则。

描述

迭代器模式的核心思想是将数据结构与遍历分离,让客户端能通过迭代器来遍历聚合对象,而不需要直接访问聚合对象的内部数据结构。迭代器模式通过定义一个公共的迭代器接口,包含了获取下一个元素、判断是否还有下一个元素等方法,具体的迭代器类则根据不同的聚合对象实现这些方法。

原理

  1. 定义迭代器接口:定义迭代器的公共方法,通常包括获取下一个元素、判断是否还有下一个元素等。
  2. 实现具体迭代器:根据不同的聚合对象实现迭代器接口中的方法,负责遍历聚合对象并返回元素。
  3. 定义聚合对象:定义聚合对象的数据结构,并提供返回迭代器的方法。
  4. 使用迭代器遍历聚合对象:客户端通过获取迭代器并使用迭代器的方法依次访问聚合对象的元素。

类图

抽象聚合(Aggregate):也叫抽象容器,定义存储、添加、删除聚合对象以及创建迭代器对象的接口。

具体聚合(ConcreteAggregate):也叫具体容器,实现内部不同结构,返回一个迭代器实例。

抽象迭代器(Iterator):定义访问和遍历聚合元素的接口。

具体迭代器(ConcreteIterator):实现抽象迭代器接口中的方法,完成对聚合对象的遍历,记录遍历的当前位置。

示例

下面是一个使用迭代器模式的简单示例,假设有一个待遍历的自定义集合类MyCollection:

cpp 复制代码
// 迭代器接口
class Iterator {
public:
    virtual ~Iterator() {}
    virtual bool hasNext() const = 0;
    virtual int next() = 0;
};

// 具体迭代器
class MyIterator : public Iterator {
public:
    MyIterator(const std::vector<int>& collection) : collection(collection), index(0) {}
    bool hasNext() const {
        return index < collection.size();
    }
    int next() {
        return collection[index++];
    }

private:
    const std::vector<int>& collection;
    int index;
};

// 聚合对象
class MyCollection {
public:
    Iterator* createIterator() const {
        return new MyIterator(elements);
    }
    void addElement(int element) {
        elements.push_back(element);
    }

private:
    std::vector<int> elements;
};

// 客户端
int main() {
    MyCollection myCollection;
    myCollection.addElement(1);
    myCollection.addElement(2);
    myCollection.addElement(3);

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

 delete iterator;
    return 0;
}

输出结果

cpp 复制代码
1 2 3

解释

在示例中,首先定义了迭代器接口Iterator,包含了判断是否还有下一个元素(hasNext)和获取下一个元素(next)的方法。然后实现了具体的迭代器MyIterator,它通过存储一个整数向量(collection)和一个索引来实现遍历操作。

接下来定义了聚合对象MyCollection,它具有一个addElement方法用于向集合中添加元素,以及一个createIterator方法用于创建并返回迭代器。

在客户端代码中,创建了一个MyCollection对象,并向其中添加了几个元素。然后通过调用createIterator方法获取迭代器,通过迭代器遍历输出了集合中的元素。

结论

迭代器模式将遍历算法与具体集合对象解耦,使得客户端不需要关心集合的内部结构并能以统一的方式遍历不同类型的集合迭代器模式增强了封装性和灵活性,符合单一职责原则和开闭原则。

应用场景

  • 当需要遍历一个聚合对象,但又不想暴露内部结构时,可以考虑使用迭代器模式。
  • 当需要提供多种遍历方式时,可以为不同的遍历方式实现不同的迭代器。
  • 当需要处理集合对象和遍历算法的耦合问题时,可以考虑使用迭代器模式。

通过迭代器模式的应用,可以使代码更加灵活、易于维护,并实现对集合对象的统一遍历操作。

相关推荐
lingran__11 分钟前
速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)
c++·算法
努力也学不会java17 分钟前
【设计模式】状态模式
java·设计模式·状态模式
.豆鲨包19 分钟前
【设计模式】单例模式
java·单例模式·设计模式
Humbunklung1 小时前
unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
c++·stl·mfc
lpfasd1232 小时前
第2课:Agent系统架构与设计模式
设计模式·系统架构
爱编程的化学家2 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
眠りたいです3 小时前
基于脚手架微服务的视频点播系统-数据管理与网络通信部分的预备工作
c++·qt·ui·微服务·云原生·架构·媒体
烦躁的大鼻嘎3 小时前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
野生的编程萌新3 小时前
【C++深学日志】C++编程利器:缺省参数、函数重载、引用详解
c语言·开发语言·c++
愚润求学3 小时前
【贪心算法】day10
c++·算法·leetcode·贪心算法