设计模式之 迭代器(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是一个迭代器。(一点猜想:忘高手指点)
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是一个迭代器。(一点猜想:忘高手指点)
相关文章推荐
- [设计模式笔记]三. 行为型模式--18. Iterator模式(迭代器)对象行为型模式(一)
- 设计模式十七:iterator(迭代器)——对象行为型模式
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
- [导入]C#面向对象设计模式纵横谈(18):(行为型模式) Iterator 迭代器模式.zip(8.04 MB)
- Iterator(迭代器)-对象行为型模式
- Iterator(迭代器)-对象行为型模式
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
- C#面向对象模式设计第十八讲:Iterator 迭代器模式(行为型模式)
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
- 3.4 Iterator(迭代器) -- 对象行为型模式
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- Android设计模式源码解析之迭代器(Iterator)模式
- 设计模式之对象行为型模式 — COMMAND (命令)模式
- [设计模式笔记]三. 行为型模式--25. Visitor模式(访问者)对象行为型模式(一)
- 十九.行为型设计模式——Iterator Pattern(迭代器模式)
- 设计模式之迭代器(Iterator Pattern)-笔记
- 设计模式 ( 十七) 状态模式State(对象行为型)