Iterator 模式

来源:互联网 发布:爱奇艺数据怎么删除 编辑:程序博客网 时间:2024/05/22 00:27

 

//Aggregate.h

 

class Iterator;

 

typedefint Object;

 

class Interator;

 

class Aggregate

{

 

public:  

 

    virtual~Aggregate();

 

    virtual Iterator* CreateIterator()=0;

 

    virtual Object GetItem(int idx)=0;

 

    virtualint GetSize()= 0;

 

protected:

 

         Aggregate();

 

};

 

class ConcreteAggregate:public Aggregate

{

 

public:  

 

    enum {SIZE=3};

 

    ConcreteAggregate();

 

    ~ConcreteAggregate();

 

    Iterator* CreateIterator();

 

    Object GetItem(int idx);

 

    int GetSize();

 

private:  

    Object _objs[SIZE];

 

};

//Aggregate.cpp

#include"Aggregate.h"

#include"Iterator.h"

 

#include<iostream>

usingnamespace std;

 

Aggregate::Aggregate()

{

 

}

 

Aggregate::~Aggregate()

{

 

}

 

ConcreteAggregate::ConcreteAggregate()

{  

    for (int i=0; i < SIZE; i++)  

        _objs[i]= i;

}

 

ConcreteAggregate::~ConcreteAggregate()

{

 

}

 

Iterator* ConcreteAggregate::CreateIterator()

{  

 

    returnnew ConcreteIterator(this);

 

}

 

Object ConcreteAggregate::GetItem(int idx)

{  

    if (idx<this->GetSize())  

        return _objs[idx];  

    else  

        return-1;

}  

 

int ConcreteAggregate::GetSize()

{  

    return SIZE;

}

 

//Iterator.h 

class Aggregate; 

typedefint Object;

 

class Iterator 

public:  

    virtual~Iterator(); 

 

    virtualvoid First()= 0

 

    virtualvoid Next()= 0

 

    virtualbool IsDone()   =0

 

    virtual Object CurrentItem()=0;

 

protected: 

 

    Iterator();

};

 

class ConcreteIterator:public Iterator 

{

 

public: 

 

    ConcreteIterator(Aggregate* ag ,int idx=0); 

 

    ~ConcreteIterator(); 

 

    void First(); 

 

    void Next(); 

 

    bool IsDone(); 

 

    Object CurrentItem();

 

private: 

 

    Aggregate* _ag;   int _idx;

};

 

//Iterator.cpp

 

#include"Iterator.h"

#include"Aggregate.h"

 

#include<iostream>

usingnamespace std;

 

Iterator::Iterator()

{

 

}

 

Iterator::~Iterator()

{

 

}

 

ConcreteIterator::ConcreteIterator(Aggregate*ag ,int idx)

{  

    this->_ag= ag; 

    this->_idx= idx;

}

 

ConcreteIterator::~ConcreteIterator()

{

 

}

 

Object ConcreteIterator::CurrentItem()

{  

    return _ag->GetItem(_idx);

}

 

void ConcreteIterator::First()

    _idx=0;

}

 

void ConcreteIterator::Next()

    if (_idx< _ag->GetSize())

        _idx++;

}

 

bool ConcreteIterator::IsDone()

{

    return (_idx== _ag->GetSize());

}

 

 

 //main.cpp

#include"Iterator.h"

#include"Aggregate.h"  

#include<iostream>

usingnamespace std;  

 

int main(int argc,char* argv[])

{  

    Aggregate* ag=new ConcreteAggregate();  

 

    Iterator* it=new ConcreteIterator(ag);

 

    for (;!(it->IsDone()) ; it->Next())

    {

         cout<<it->CurrentItem()<<endl;

    }  

    

    return0;

}

代码说明

 

Iterator模式的实现代码很简单,实际上为了更好地保护 Aggregate的状态,我们可以尽量减小Aggregatepublic接口,而通过将Iterator对象声明位Aggregate的友元来给予Iterator一些特权,获得访问 Aggregate 私有数据和方法的机会。

 

Iterator模式的应用很常见,我们在开发中就经常会用到 STL中预定义好的 Iterator来对STL类进行遍历(VectorSet等)

 

 

原创粉丝点击