设计模式之迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个集合对象中的元素,而不需要暴露该对象的内部表示。迭代器模式非常适合用于容器类的设计,使得客户端代码可以通过统一的接口访问不同类型的集合。

1. 主要组成部分

  • 迭代器(Iterator) :定义访问集合元素的接口,包括方法如 next(), hasNext(), remove() 等。
  • 聚合(Aggregate):定义创建迭代器的接口。
  • 具体迭代器(Concrete Iterator):实现迭代器接口,维护对当前元素的引用和对集合的引用。
  • 具体聚合(Concrete Aggregate):实现聚合接口,返回具体迭代器的实例。

2. UML 类图

lua 复制代码
+------------------+
|    Iterator      |
+------------------+
| +next()          |
| +hasNext()      |
+------------------+
        ^
        |
+------------------+
| ConcreteIterator  |
+------------------+
| -collection: Collection |
| -index: int            |
+------------------+
| +next()          |
| +hasNext()      |
+------------------+

+------------------+
|    Aggregate     |
+------------------+
| +createIterator()|
+------------------+
        ^
        |
+------------------+
| ConcreteAggregate|
+------------------+
| -items: List     |
+------------------+
| +createIterator()|
+------------------+

3. 示例代码

以下是一个简单的迭代器模式实现示例,使用 C++。

cpp 复制代码
#include <iostream>
#include <vector>

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

// 聚合接口
class Aggregate {
public:
    virtual ~Aggregate() {}
    virtual Iterator* createIterator() = 0;
};

// 具体迭代器
class ConcreteIterator : public Iterator {
private:
    const std::vector<int>& collection;
    size_t index;

public:
    ConcreteIterator(const std::vector<int>& coll) : collection(coll), index(0) {}

    int next() override {
        return collection[index++];
    }

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

// 具体聚合
class ConcreteAggregate : public Aggregate {
private:
    std::vector<int> items;

public:
    void addItem(int item) {
        items.push_back(item);
    }

    Iterator* createIterator() override {
        return new ConcreteIterator(items);
    }
};

// 客户端代码
int main() {
    ConcreteAggregate aggregate;
    aggregate.addItem(1);
    aggregate.addItem(2);
    aggregate.addItem(3);

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

    delete iterator;
    return 0;
}

4. 优点

  • 解耦:迭代器模式将集合的遍历与集合的实现分离,使得代码更清晰,易于维护。
  • 统一接口:不同的集合可以通过相同的接口进行遍历,增强了灵活性和扩展性。
  • 支持多种遍历方式:可以实现多种不同的迭代器,如正向、反向、递归等。

5. 缺点

  • 增加复杂性:引入了额外的类和接口,增加了系统的复杂性。
  • 性能开销:迭代器模式可能会导致性能开销,特别是在频繁创建和销毁迭代器的情况下。

总结

迭代器模式是一种强大的设计模式,特别适合用于集合类的设计。它通过提供统一的访问接口,使得客户端能够轻松遍历不同类型的集合,同时保持代码的清晰和灵活。

相关推荐
BD_Marathon12 小时前
设计模式——合成复用原则
设计模式·合成复用原则
书院门前细致的苹果1 天前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
BD_Marathon1 天前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon1 天前
设计模式——里氏替换原则
java·设计模式·里氏替换原则
jmxwzy1 天前
设计模式总结
设计模式
J_liaty2 天前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇2 天前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日2 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.2 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon2 天前
七大设计原则介绍
设计模式