设计模式---迭代器模式(C++实现)

来源:互联网 发布:淘宝秒杀催生团队 编辑:程序博客网 时间:2024/06/05 13:26

迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。


意图

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


解决问题

不同的方式遍历整个对象

如何解决

把元素之间游走的责任交给迭代器,而不是聚合对象。


优点

1. 支持不同的 方式遍历聚合对象

2. 迭代器模式简化了聚合类

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

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

缺点

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


使用场景

1. 访问一个聚合对象的内容而无需暴露它的内部表示;

2. 需要为聚合对象提供多种遍历方式

3. 为遍历不同的聚合结构提供一个统一的接口

注意事项

        迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部数据。



C++实现

       举例子: 在现在的电视机中,我们使用[后一个]和[前一个]按钮可以很方便的换台,当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。


UML类图


code:

//迭代器模式/*1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口。4.具体集合角色(Concrete Aggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。*/template<class Item> //迭代器角色class  Iterator{public :virtual void First() = 0;virtual void Next() = 0;virtual Item* CurrentItem() = 0;virtual bool isDone() = 0;virtual ~Iterator(){}};template<class Item>//集合角色class  Aggregate{public:virtual Iterator<Item>* CreateIterator() = 0;virtual ~Aggregate(){}};template<class Item>//具体集合角色class ConcreteAggregate : public Aggregate<Item>{vector<Item> data;public:ConcreteAggregate(){data.push_back(1);data.push_back(2);data.push_back(3);}virtual Iterator<Item>* CreateIterator(){return new ConcreteIterator<Item>(this);}Item& operator[](int index){return data[index];}int GetLen(){return data.size();}};template<class Item>class ConcreteIterator : public Iterator<Item> //具体迭代器{ConcreteAggregate<Item>* aggr;int cur;public:ConcreteIterator(ConcreteAggregate<Item>* a):aggr(a), cur(0){}virtual void First(){cur = 0;}virtual void Next(){if (cur < aggr->GetLen())cur++;}virtual Item* CurrentItem(){if (cur < aggr->GetLen())return  &(*aggr)[cur];//aggr是指针所以需要先解引用再[],最后返回元素地址elsereturn NULL;}virtual bool isDone(){return (cur >= aggr->GetLen());}};

客户端:

int test_Iterator()  //迭代器模式{Aggregate<int> *aggr = new ConcreteAggregate<int>();Iterator<int>* it = aggr->CreateIterator();//这里的设计挺秒for (it->First(); ! it->isDone(); it->Next())//遍历{cout << *(it->CurrentItem()) << endl;}delete it;delete aggr;system("pause");return 0;}



学习建议:  看看STL里面的迭代器实现吧 ,很经典


0 0
原创粉丝点击