[设计模式]行为模式-迭代器(C++描述)

本文详细介绍了迭代器模式在C++中的应用,包括模式定义、结构图、代码实现及使用场景,展示了如何通过迭代器简化容器遍历,并讨论了其优缺点。

 [设计模式]行为模式-迭代器(C++描述)

second60 20180605

1. 迭代器模式定义

迭代器,作为学C++的人,应该都接触过迭代器。在STL的每个容器中,都会对应有个迭代器。

迭代器的目的很简单,就是用来遍历用的。

 

定义:顺序访问集合对象的元素,不需要知道集合对象的底层表示。

2. 迭代器模式结构图

 

分析:

1. 聚合类父类Aggregate:也可以说是容器类父类,里面存放的是某种结构的容器,可以是链表,也可以是数组等,里面包含创建迭器器的方类。

2. 实体聚合类ConcreteAggregate: 具体容器类,容器的真正实现。

3. 迭代器Iterator: 包含迭代器的常用操作,begin,end,next,++等

4. 具体迭代器类ConcreteIterator:迭代器实现类

3. 代码

#include <iostream>
using namespace std;

class Iterator;

typedef int Object;

class Aggregate {
public:
    virtual ~Aggregate() {}
    virtual Iterator* createIterator() = 0;
    virtual Object getItem(int idx) = 0;
    virtual int getSize() = 0;
};

#define MAXSIZE 10

// 前向声明
class ConcreteIterator;

class ConcreteAggregate : public Aggregate {
public:
    ConcreteAggregate() {
        for (int i = 0; i < MAXSIZE; i++) {
            _objs[i] = i;
        }
    }
    
    virtual ~ConcreteAggregate() {}
    
    // ✅ 只声明,不实现
    Iterator* createIterator() override;
    
    Object getItem(int idx) override {
        if (idx < getSize()) {
            return _objs[idx];
        }
        return -1;
    }
    
    int getSize() override {
        return MAXSIZE;
    }
    
private:
    Object _objs[MAXSIZE];
};

class Iterator {
public:
    virtual ~Iterator() {}
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() = 0;
    virtual Object CurrentItem() = 0;
};

class ConcreteIterator : public Iterator {
public:
    ConcreteIterator(Aggregate* ag, int idx = 0) {
        _ag = ag;
        _idx = idx;
    }
    
    ~ConcreteIterator() {}
    
    void First() override {
        _idx = 0;
    }
    
    void Next() override {
        if (_idx < _ag->getSize()) {
            _idx++;
        }
    }
    
    bool IsDone() override {
        return (_idx == _ag->getSize());
    }
    
    Object CurrentItem() override {
        return _ag->getItem(_idx);
    }
    
private:
    Aggregate* _ag;
    int _idx;
};

// ✅ 在 ConcreteIterator 定义之后实现
Iterator* ConcreteAggregate::createIterator() {
    return new ConcreteIterator(this);
}

int main() {
    Aggregate* ag = new ConcreteAggregate();
    Iterator* it = ag->createIterator();
    
    for (; !it->IsDone(); it->Next()) {
        cout << it->CurrentItem() << endl;
    }
    
    delete it;
    delete ag;
    
    return 0;
}

4 使用场景

1. 遍历一个聚合对象

2. 无须知道聚合对象内部实现

5 优缺点

优点:

1. 它支持以不同的方式遍历一个聚合对象。 (正向或逆向)

2. 迭代器简化了聚合类。

3. 在同一个聚合上可以有多个遍历。

4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点:

1. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

6 总结

在容器中,具本都会用到迭代器,目的是为了方便容器的遍历,使容器和具体的遍历分离出来。

在写容器时,具本都会自已写个迭代器,无论是面向对象还是面向过程,迭代器都是通用的。在redis源码中,有具体的面向过程迭代器的现实,参考: https://blog.csdn.net/second60/article/details/80287897 

23个设计模式,这是第22个了。坚持就是胜利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值