1、迭代器的定义:
提供一种方法,使之能够依序访问某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。
2、迭代器的设计动机
一个聚合对象,应该提供一种方法来让别人可以访问它的元素,而又不需暴露它的内部结构。此外,针对不同的需要,可能要以不同的方式遍历这个容器。但即使可以预见到所需的那些遍历操作,你可能也不希望容器的接口中充斥着各种不同的遍历的操作。有时可能需要在同一个容器上同时进行多个遍历。
迭代器模式的关键思想是将对列表的访问和遍历从容器对象中分离出来并放入一个迭代器(iterator)对象中。迭代器类定义了一个访问该容器的接口。迭代器对象负责跟踪当前的元素;即它知道哪些元素已经遍历过了。将遍历机制与列表对象分离使我们可以定义不同的迭代器来实现不同的遍历策略,而无需在容器接口中列举它们。
一般一个迭代器类需要提供以下操作:
(1) First():初始化迭代器,使当前元素指向列表的第一个元素。
(2) Next():将当前元素指针向前推进一步,指向下一个元素。
(3) CurrentItem():返回容器中的当前元素。
(4) IsDone():检查是否已越过最后一个元素,也就是完成了本次遍历。
3、迭代器的适用性
(1)访问一个聚合对象的内容而无需暴露它的内部表示。
(2)支持对聚合对象的多种遍历
(3)为遍历不同的聚合结构提供一个统一的接口
4、空迭代器
一个空迭代器(NullIterator)是一个退化的迭代器,它有助于处理边界条件,根据定义,空迭代器总是已经完成了遍历,即,它的IsDone操作总是返回true;
5、例子——IE缓存迭代器
以下用C++实现一个迭代器类,用于遍历IE缓存空间。我们在访问网站或本地文件时,系统会把图片、动画、浏览记录等信息保存在Internet临时文件夹中,但这个文件夹是一个隐藏文件夹,不同于普通文件夹,Win32 API给用户提供了很多接口用于访问,修改这个文件夹里的内容。为了展示怎样怎样设计IE缓存迭代器,需要用到以下Win32 API。
5.1 需要用到的Win32 API
最低配置,头文件、库及动态链接库:
Minimum supported client |
Windows 2000 Professional [desktop apps only] |
Minimum supported server |
Windows 2000 Server [desktop apps only] |
Header |
Wininet.h |
Library |
Wininet.lib |
DLL |
Wininet.dll |
(1)IE缓存的入口点
HANDLE FindFirstUrlCacheEntry(
_In_ LPCTSTR lpszUrlSearchPattern,
_Out_ LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo,
_Inout_ LPDWORD lpcbCacheEntryInfo
);
参数: