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

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

second60 20180605

1. 迭代器模式定义

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

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

 

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

2. 迭代器模式结构图

 

分析:

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

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

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

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

3. 代码

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

#define MAXSIZE 1024
class ConcreteAggregate: public  Aggregate
{
public :
    ConcreteAggregate()
    {
        for(int i = 0; i < MAXSIZE; i++)
        _objs[i] = i;
    }
    ~ConcreteAggregate(){}
    Iterator * createIterator()
    {
        return new ConcreteIterator(this);
    }

    Object getItem(int idx){
        if(idx < this->getSize())
            return _objs[idx];
        else
            return -1;
    }

    int getsize(){return MAXSIZE;}
private:
    Object _objs[MAXSIZE];
};

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

class ConcreteIterator: public Iterator
{
public:
    ConcreteIterator(Aggregate* ag, int idx = 0)
    {
        _ag = ag;
        _idx = idx;
    }

    ~ConcreteIterator(){}
    void First(){_idx = 0;}
    void Next(){ if(_idx < _ag->GetSize()) _idx++;}
    bool IsDone(){return (_idx == _ag->GetSize());}
    Object  CurrentItem()
    {
        return _ag->GetItem(_idx);
    }
private:
    Aggregate* _ag;
    int _idx;
};

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

4 使用场景

1. 遍历一个聚合对象

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

5 优缺点

优点:

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

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

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

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

缺点:

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

6 总结

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

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

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

猜你喜欢

转载自blog.csdn.net/second60/article/details/80602805