您的位置:首页 > 其它

设计模式之 迭代器(Iterator)----对象行为型模式

2005-07-23 11:23 441 查看
//设计模式之 迭代器(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是一个迭代器。(一点猜想:忘高手指点)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: