//设计模式之 迭代器(Iterator)----对象行为型模式 ( 学习笔记)
1.意图
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
2.别名: 游标(Cursor)
3.适用性
*访问一个聚合对象的内容而无需暴露它的内部表示。
*支持对聚合对象的多种遍历。
*为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
4.结构
5.参与者
*迭代器(Iterator)
---迭代器定义访问和遍历元素的接口。
*具体迭代器(ConcreteIterator)
---具体迭代器实现迭代器的接口。
---对该聚合遍历时跟踪当前位置。
*聚合(Aggregate)
--聚合定义创建相应迭代器对象的接口。
*具体聚合(ConcreteAggregate)
---具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
6.协作
ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象。
7.代码示例:
const int DEFAULT_LIST_CAPACITY = 100;
template <class Item> class Iterator;
template <class Item> //列表类模板
class List {
public:
List(long size = DEFAULT_LIST_CAPACITY);
Iterator<Item>* CreateIterator() const;
long Count() const;
Item& Get(long index) const;
// ...
};
template <class Item> //迭代器
class Iterator {
public:
virtual void First() = 0;
virtual void Next() = 0;
virtual bool IsDone() const = 0; //判断是否遍历完
virtual Item CurrentItem() const = 0;
protected:
Iterator();
};
template <class Item>
class ListIterator : public Iterator<Item>//具体迭代器
{
public:
ListIterator(const List<Item>* aList);
virtual void First();
virtual void Next();
virtual bool IsDone() const;
virtual Item CurrentItem() const;
private:
const List<Item>* _list;
long _current;
};
template <class Item>
ListIterator<Item>::ListIterator (
const List<Item>* aList
) : _list(aList), _current(0) {
}
template <class Item>
void ListIterator<Item>::First () {
_current = 0;
}
template <class Item>
void ListIterator<Item>::Next () {
_current++;
}
template <class Item>
bool ListIterator<Item>::IsDone () const {
return _current >= _list->Count();
}
//class IteratorOutOfBounds;
#define throw //
template <class Item>
Item ListIterator<Item>::CurrentItem () const {
if (IsDone()) {
throw IteratorOutOfBounds;
}
return _list->Get(_current);
}
template <class Item> //倒序遍历迭代器
class ReverseListIterator : public Iterator<Item> {
public:
ReverseListIterator(const List<Item>* aList);
virtual void First();
virtual void Next();
virtual bool IsDone() const;
virtual Item CurrentItem() const;
};
/***********************************************************************
*
*以下是一个雇员List的应用,实现打印雇员的信息
*
*
*************************************************************************/
class Employee {
public:
void Print();
};
List<Employee*>* employees; //雇员列表类
// ...
ListIterator<Employee*> forward(employees);
ReverseListIterator<Employee*> backward(employees);
void PrintEmployees (Iterator<Employee*>& i)
{
for (i.First(); !i.IsDone(); i.Next())
{
i.CurrentItem()->Print();
}
}
//以下两句实现按前后遍历顺序打印所有雇员信息
PrintEmployees(forward);
PrintEmployees(backward);
8.一点猜想
以前用过mfc的ODBC编写过数据库应用程序,回过头来想想,其中的主要的两个类CDatabase和CRecordSet 我觉得就是此模式中的应用。CRecordSet是一个迭代器。(一点猜想:忘高手指点)