C++设计模式实例:迭代器模式实现

需积分: 5 0 下载量 55 浏览量 更新于2024-11-29 收藏 1KB ZIP 举报
资源摘要信息:"cpp代码-设计模式-迭代器模式" 迭代器模式是行为型设计模式之一,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。在C++中,迭代器模式经常被用来简化容器类(比如std::vector、std::list等)中元素的遍历操作。 C++标准库中的迭代器是一种泛化的指针,它们能够通过operator*来获取元素的值,并通过operator->来获取元素的成员。迭代器模式通过定义一个共同的接口来遍历不同类型的容器,使得算法和容器的实现可以独立变化。 在C++中实现迭代器模式通常涉及以下几个角色: 1. 迭代器(Iterator)角色:定义访问和遍历元素的接口,通常包括:获取第一个元素的first()方法、获取下一个元素的next()方法、判断是否到达集合结束的isDone()方法和获取当前元素的currentItem()方法。 2. 具体迭代器(Concrete Iterator)角色:实现迭代器接口,并保持遍历中的内部状态。 3. 容器(Container)角色:提供创建具体迭代器角色的接口,即createIterator()方法。 4. 具体容器(Concrete Container)角色:包含具体元素的集合,并提供具体迭代器对象。 以下是一个简单的C++迭代器模式示例代码: ```cpp #include <iostream> #include <list> // 抽象迭代器 class Iterator { public: virtual void first() = 0; virtual void next() = 0; virtual bool isDone() = 0; virtual int current() = 0; }; // 具体迭代器 class ConcreteIterator : public Iterator { private: std::list<int>::iterator m_iter; std::list<int> m_list; public: ConcreteIterator(std::list<int>& list) : m_list(list) { first(); } void first() override { m_iter = m_list.begin(); } void next() override { ++m_iter; } bool isDone() override { return m_iter == m_list.end(); } int current() override { return *m_iter; } }; // 抽象容器 class Container { public: virtual Iterator* createIterator() = 0; }; // 具体容器 class ConcreteContainer : public Container { private: std::list<int> m_list; public: void add(int value) { m_list.push_back(value); } Iterator* createIterator() override { return new ConcreteIterator(m_list); } }; int main() { ConcreteContainer container; container.add(1); container.add(2); container.add(3); Iterator* iterator = container.createIterator(); iterator->first(); while (!iterator->isDone()) { std::cout << iterator->current() << std::endl; iterator->next(); } delete iterator; return 0; } ``` 在上述代码中,`ConcreteContainer`类拥有一个`std::list<int>`类型的私有成员`m_list`,并实现了`createIterator`方法来创建一个迭代器。`ConcreteIterator`类实现了迭代器的接口,并通过内部的`std::list<int>::iterator`来遍历列表。在`main`函数中,我们创建了一个`ConcreteContainer`实例,向其中添加了一些元素,然后使用迭代器来遍历并打印了这些元素。 迭代器模式的优点包括: - 它支持以不同的方式遍历一个聚合对象。 - 迭代器简化了聚合类,使得聚合类无需提供遍历逻辑。 - 支持对同一个聚合对象使用多种遍历方式。 然而,迭代器模式也存在一些局限性,例如: - 对于特定类型的聚合,使用迭代器可能比直接操作更加复杂。 - 有些情况下,创建迭代器对象可能需要额外的开销。 总之,迭代器模式为遍历不同数据结构提供了一个统一的接口,使得客户端代码与具体的聚合实现之间解耦,增强了代码的可维护性和可扩展性。