0 引言
0.1 目的
本文档给出设计模式之——Iterator模式的简化诠释,并给出其C++实现。
0.2 说明
Project |
Design Pattern Explanation(By K_Eckel) |
Authorization |
Free Distributed but Ownership Reserved |
Date |
|
Test Bed |
MS Visual C++ 6.0 |
0.3 参考
在本文档的写作中,参考了以下的资源,在此列出表示感谢:
u 书籍
[GoF 2000]:GoF,Design Patterns-Elements of Reusable Object-Oriented Software
Addison-Wesley 2000/9.
[Martine 2003]:Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.
0.4 联系作者
Author |
K_Eckel |
State |
Candidate for Master’s Degree School of |
E_mail |
2 Iterator模式
2.1 问题
Iterator模式应该是最为熟悉的模式了,最简单的证明就是我在实现Composite模式、Flyweight模式、Observer模式中就直接用到了STL提供的Iterator来遍历Vector或者List数据结构。
Iterator模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。
2.2 模式选择
Iterator模式典型的结构图为:
图2-1:Iterator Pattern结构图
Iterator模式中定义的对外接口可以视客户成员的便捷定义,但是基本的接口在图中的Iterator中已经给出了(参考STL的Iterator就知道了)。
2.3 实现
2.3.1 完整代码示例(code)
Iterator模式的实现比较简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。
代码片断1:Aggregate.h #ifndef _AGGREGATE_H_ class Iterator; typedef int Object; class Interator; class Aggregate virtual Iterator* CreateIterator() = 0; virtual Object GetItem(int idx) = 0; virtual int GetSize() = 0; protected: private: }; class ConcreteAggregate:public Aggregate ConcreteAggregate(); ~ConcreteAggregate(); Iterator* CreateIterator(); Object GetItem(int idx); int GetSize(); protected: private: }; #endif //~_AGGREGATE_H_ |
代码片断2:Aggregate.cpp #include "Aggregate.h" Aggregate::Aggregate() } Aggregate::~Aggregate() } ConcreteAggregate::ConcreteAggregate() ConcreteAggregate::~ConcreteAggregate() } Iterator* ConcreteAggregate::CreateIterator() Object ConcreteAggregate::GetItem(int idx) int ConcreteAggregate::GetSize() |
代码片断3:Iterator.h #ifndef _ITERATOR_H_ class Aggregate; typedef int Object; class Iterator virtual void First() = 0; virtual void Next() = 0; virtual bool IsDone() = 0; virtual Object CurrentItem() = 0; protected: private: }; class ConcreteIterator:public Iterator ~ConcreteIterator(); void First(); void Next(); bool IsDone(); Object CurrentItem(); protected: private: int _idx; }; #endif //~_ITERATOR_H_ |
代码片断4:Iterator.cpp #include "Iterator.h" Iterator::Iterator() } Iterator::~Iterator() } ConcreteIterator::ConcreteIterator(Aggregate* ag , int idx) this->_idx = idx; ConcreteIterator::~ConcreteIterator() } Object ConcreteIterator::CurrentItem() void ConcreteIterator::First() void ConcreteIterator::Next() bool ConcreteIterator::IsDone() |
代码片断5:main.cpp #include "Iterator.h" #include <iostream> int main(int argc,char* argv[]) Iterator* it = new ConcreteIterator(ag); for (; !(it->IsDone()) ; it->Next()) return 0; |
2.3.2 代码说明
Iterator模式的实现代码很简单,实际上为了更好地保护Aggregate的状态,我们可以尽量减小Aggregate的public接口,而通过将Iterator对象声明位Aggregate的友元来给予Iterator一些特权,获得访问Aggregate私有数据和方法的机会。
2.4 讨论
Iterator模式的应用很常见,我们在开发中就经常会用到STL中预定义好的Iterator来对STL类进行遍历(Vector、Set等)。