Iterator(迭代器)设计模式
2015-12-13 20:22
369 查看
声明:本博文篇幅短,适合review。
一、概念
提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节。
二、模式结构图
三、例子
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 ConcreteIterator : public Iterator <Item>
{
private:
ConcreteAggregate<Item> * aggr;
int cur;
public:
ConcreteIterator(ConcreteAggregate<Item>* a):aggr(a),cur(0){}
void first()
{
cur = 0;
}
void next()
{
if(cur < aggr->getSize())
cur++;
}
Item currentItem()
{
if(cur < aggr->getSize())
return (*aggr)[cur];
else
return NULL;
}
bool isDone()
{
return (cur >= aggr->getSize());
}
};
template<class Item>
class Aggregate
{
public:
virtual Iterator<Item>* createIterator()=0;
virtual ~Aggregate(){}
};
template<class Item>
class ConcreteAggregate : public Aggregate<Item>
{
private:
vector<Item> data;
public:
ConcreteAggregate()
{
data.push_back(1);
data.push_back(2);
data.push_back(3);
}
Iterator<Item>* createIterator()
{
return new ConcreteIterator<Item>(this);
}
Item& operator[](int index)
{
return data[index];
}
int getSize()
{
return data.size();
}
};
void main()
{
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;
}
四、优缺点
1、优点
a、隐藏容器的实现细节。
b、可以为容器或其子容器实现不同的迭代方法或多个迭代方法。
c、支持多态迭代。
2、缺点
a、遍历时不可以删除或者增加数据对象。
一、概念
提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节。
二、模式结构图
三、例子
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 ConcreteIterator : public Iterator <Item>
{
private:
ConcreteAggregate<Item> * aggr;
int cur;
public:
ConcreteIterator(ConcreteAggregate<Item>* a):aggr(a),cur(0){}
void first()
{
cur = 0;
}
void next()
{
if(cur < aggr->getSize())
cur++;
}
Item currentItem()
{
if(cur < aggr->getSize())
return (*aggr)[cur];
else
return NULL;
}
bool isDone()
{
return (cur >= aggr->getSize());
}
};
template<class Item>
class Aggregate
{
public:
virtual Iterator<Item>* createIterator()=0;
virtual ~Aggregate(){}
};
template<class Item>
class ConcreteAggregate : public Aggregate<Item>
{
private:
vector<Item> data;
public:
ConcreteAggregate()
{
data.push_back(1);
data.push_back(2);
data.push_back(3);
}
Iterator<Item>* createIterator()
{
return new ConcreteIterator<Item>(this);
}
Item& operator[](int index)
{
return data[index];
}
int getSize()
{
return data.size();
}
};
void main()
{
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;
}
四、优缺点
1、优点
a、隐藏容器的实现细节。
b、可以为容器或其子容器实现不同的迭代方法或多个迭代方法。
c、支持多态迭代。
2、缺点
a、遍历时不可以删除或者增加数据对象。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- PropertyChangeListener简单理解
- 关于指针的一些事情
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 设计模式之行为型模式 - 调用行为的传递问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- c++ primer 第五版 笔记前言
- 架构纵横谈之二 ---- 架构的模式与要点
- share_ptr的几个注意点
- BS项目中的CSS架构_仅加载自己需要的CSS
- Ruby中的迭代器详解
- Ruby中Block和迭代器的使用讲解
- Lua中调用C++函数示例
- Lua中的迭代器浅析
- Lua中的迭代器和泛型for介绍
- Lua教程(一):在C++中嵌入Lua脚本