Iterator 模式

 

//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等)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值