设计模式16之c++迭代器模式(含示例代码)

迭代器模式是一种行为型设计模式,它提供了一种顺序访问聚合对象中各个元素的方法,而不需要暴露该对象的内部表示。迭代器模式可以用于实现容器类、遍历算法等应用。

下面是一个使用 C++ 实现迭代器模式的示例代码:

#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 VectorIterator : public Iterator {
    
    
public:
    VectorIterator(std::vector<int>& vector) : vector_(vector), index_(0) {
    
    }
    int Next() override {
    
    
        int value = vector_[index_];
        index_++;
        return value;
    }
    bool HasNext() override {
    
    
        return index_ < vector_.size();
    }
private:
    std::vector<int>& vector_;
    int index_;
};
// 具体聚合类:向量聚合
class VectorAggregate : public Aggregate {
    
    
public:
    VectorAggregate() {
    
    
        for (int i = 0; i < 10; i++) {
    
    
            vector_.push_back(i);
        }
    }
    Iterator* CreateIterator() override {
    
    
        return new VectorIterator(vector_);
    }
private:
    std::vector<int> vector_;
};
int main() {
    
    
    // 创建向量聚合对象
    VectorAggregate vector_aggregate;
    // 创建向量迭代器对象
    Iterator* iterator = vector_aggregate.CreateIterator();
    // 遍历向量
    while (iterator->HasNext()) {
    
    
        std::cout << iterator->Next() << " ";
    }
    std::cout << std::endl;
    // 释放迭代器对象
    delete iterator;
    return 0;
}

在上面的代码中,我们首先定义了一个 Iterator 抽象类,其中包含了 Next() 和 HasNext() 纯虚函数。具体迭代器类 VectorIterator 实现了 Next() 和 HasNext() 函数,以完成向量的遍历。聚合抽象类 Aggregate 定义了 CreateIterator() 纯虚函数,用于创建迭代器。具体聚合类 VectorAggregate 实现了 CreateIterator() 函数,以创建向量迭代器。

在 main() 函数中,我们首先创建了一个向量聚合对象 vector_aggregate,然后通过 CreateIterator() 函数创建了向量迭代器对象 iterator,最后遍历向量并输出结果。在结束遍历后,我们释放了迭代器对象。

迭代器模式的优点在于它将遍历算法与聚合对象分离,使得聚合对象的内部表示不会被暴露。同时,迭代器模式也提供了一种通用的遍历接口,使得遍历算法可以轻松地应用于不同的聚合对象上。但是,由于迭代器模式需要创建迭代器对象,因此它可能会增加系统的开销。

猜你喜欢

转载自blog.csdn.net/dica54dica/article/details/130021382