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

来源:互联网 发布:霍元甲 大力士 知乎 编辑:程序博客网 时间:2024/04/24 18:29

//设计模式之 迭代器(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是一个迭代器。(一点猜想:忘高手指点)

原创粉丝点击