迭代器模式
迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集, 聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集 的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色 变化。
我爱上了Mary,不顾一切的向她求婚。 Mary:“想要我跟你结婚,得答应我的条件” 我:“什么条件我都答应,你说吧” Mary:“我看上了那个一克拉的钻石” 我:“我买,我买,还有吗?” Mary:“我看上了湖边的那栋别墅” 我:“我买,我买,还有吗?” Mary:“我看上那辆法拉利跑车” 我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?” ……
#include <iostream>
using namespace std;
#define SIZE 5
typedef int Object;
class Iterator{
public:
virtual ~Iterator(){}
virtual void first()=0;
virtual void next()=0;
virtual bool end()=0;
virtual Object curItem()=0;
};
class Aggregate{
public:
virtual ~Aggregate(){}
virtual Iterator *createIterator()=0;
virtual Object getItem(int index)=0;
virtual int getSize()=0;
};
class ConcreteIterator : public Iterator{
public:
ConcreteIterator(Aggregate *ag){
this->ag=ag;
index=0;
}
virtual void first(){
index=0;
}
virtual void next(){
if(index<ag->getSize()){
index++;
}
}
virtual bool end(){
return (index == ag->getSize());
}
Object curItem(){
return ag->getItem(index);
}
private:
int index;
Aggregate* ag;
};
class ConcreteAggregate : public Aggregate{
public:
ConcreteAggregate(){
for(int i=0; i<SIZE; i++){
object[i]=i+1;
}
}
virtual Iterator* createIterator(){
return new ConcreteIterator(this);
}
virtual Object getItem(int index){
return object[index];
}
virtual int getSize(){
return SIZE;
}
private:
Object object[SIZE];
};
int main(){
Aggregate *ag = new ConcreteAggregate();
Iterator *it = new ConcreteIterator(ag);
for(;!(it->end());it->next()){
std::cout << it->curItem() << std::endl;
}
delete ag;
delete it;
return 0;
}