迭代器模式

1迭代器角色Iterator):迭代器角色负责定义访问和遍历元素的接口。
2.具体迭代器角色Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3.集合角色Aggregate):集合角色负责提供创建具体迭代器角色的接口。
4.具体集合角色Concrete Aggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。

 

 

#include <iostream>
#include <vector>
using namespace std;

class Iterator
{
public:
    virtual void first()=0;
    virtual void next()=0;
    virtual int currentItem()=0;
    virtual bool isDone()=0;
    virtual ~Iterator(){}
};

class ConcreteIterator : public Iterator <Item>
{
    ConcreteAggregate* aggr;
    int cur;
public:
    ConcreteIterator(ConcreteAggregate* a):aggr(a),cur(0){}
    virtual void first()
    {
        cur=0;
    }
    virtual void next()
    {
        if(cur<aggr->getLen())
            cur++;
    }
    virtual int currentItem()
    {
        if(cur<aggr->getLen())
            return &(*aggr)[cur];
        else
            return NULL;
    }
    virtual bool isDone()
    {
        return (cur>=aggr->getLen());
    }
};

class Aggregate
{
public:
    virtual Iterator* createIterator()=0;
    virtual ~Aggregate(){}
};

class ConcreteAggregate:public Aggregate
{
    int data[100];//100
public:
    ConcreteAggregate()
    {
        for (int i = 0;  i  <  100;  i++) 
        data[i]  =  i; 
    }
    virtual Iterator* createIterator()
    {
        return new ConcreteIterator(this);
    }
    int getItem(int index)
    {
if(index<data.size())
        return data[index];
else
        return -1;
    }
    int getLen()
    {
        return data.size();
    }
};

int main()
{
    Aggregate* aggr =new ConcreteAggregate();
    Iterator *it=aggr->createIterator();

    for(it->first();!it->isDone();it->next())
    {
        cout<<*(it->currentItem())<<endl;
    }
    delete it;
    delete aggr;
    return 0;
}

 

提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

 

 

 

 

 

 

 

 

 

posted @ 2013-07-25 22:49  风啊  阅读(93)  评论(0)    收藏  举报