0 引言

0.1 目的

       本文档给出设计模式之——Iterator模式的简化诠释,并给出其C++实现

0.2 说明

Project

Design Pattern ExplanationBy K_Eckel

Authorization

Free Distributed but Ownership Reserved

Date

2005-04-05Cherry blossom is Beautiful

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 Computer Wuhan University

E_mail

frwei@whu.edu.cn 

2 Iterator模式

2.1 问题

       Iterator模式应该是最为熟悉的模式了,最简单的证明就是我在实现Composite模式、Flyweight模式、Observer模式中就直接用到了STL提供的Iterator来遍历Vector或者List数据结构。

       Iterator模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。

2.2 模式选择

       Iterator模式典型的结构图为:


2-1Iterator Pattern结构图

       Iterator模式中定义的对外接口可以视客户成员的便捷定义,但是基本的接口在图中的Iterator中已经给出了(参考STLIterator就知道了)。

2.3 实现

2.3.1 完整代码示例(code

       Iterator模式的实现比较简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。

代码片断1Aggregate.h
//Aggregate.h

#ifndef _AGGREGATE_H_
#define _AGGREGATE_H_

class Iterator;

typedef int Object;

class Interator;

class Aggregate
{
public:
 virtual ~Aggregate();

 virtual Iterator* CreateIterator() = 0;

 virtual Object GetItem(int idx) = 0;

 virtual int GetSize() = 0;

protected:
 Aggregate();

private:

};

class ConcreteAggregate:public Aggregate
{
public:
 enum {SIZE = 3};

 ConcreteAggregate();

 ~ConcreteAggregate();

 Iterator* CreateIterator();

 Object GetItem(int idx);

 int GetSize();

protected:

private:
 Object _objs[SIZE];

};

#endif //~_AGGREGATE_H_

 代码片断2Aggregate.cpp
//Aggregate.cpp

#include "Aggregate.h"
#include "Iterator.h"
#include <iostream>
using namespace std;

Aggregate::Aggregate()
{

}

Aggregate::~Aggregate()
{

}

ConcreteAggregate::ConcreteAggregate()
{
 for (int i = 0; i < SIZE; i++)
  _objs[i] = i;
}

ConcreteAggregate::~ConcreteAggregate()
{

}

Iterator* ConcreteAggregate::CreateIterator()
{
 return new ConcreteIterator(this);
}

Object ConcreteAggregate::GetItem(int idx)
{
 if (idx < this->GetSize())
  return _objs[idx];
 else
  return -1;
}

int ConcreteAggregate::GetSize()
{
 return SIZE;
}

代码片断3Iterator.h
//Iterator.h

#ifndef _ITERATOR_H_
#define _ITERATOR_H_

class Aggregate;

typedef int Object;

class Iterator
{
public:
 virtual ~Iterator();

 virtual void First() = 0;

 virtual void Next() = 0;

 virtual bool IsDone()  = 0;

 virtual Object CurrentItem() = 0;

protected:
 Iterator();

private:

};

class ConcreteIterator:public Iterator
{
public:
 ConcreteIterator(Aggregate* ag , int idx = 0);

 ~ConcreteIterator();

 void First();

 void Next();

 bool IsDone();

 Object CurrentItem();

protected:

private:
 Aggregate* _ag;

 int _idx;

};

#endif //~_ITERATOR_H_

代码片断4Iterator.cpp
//Iterator.cpp

#include "Iterator.h"
#include "Aggregate.h"
#include <iostream>
using namespace std;

Iterator::Iterator()
{

}

Iterator::~Iterator()
{

}

ConcreteIterator::ConcreteIterator(Aggregate* ag , int idx)

 this->_ag = ag;

 this->_idx = idx;
}

ConcreteIterator::~ConcreteIterator()
{

}

Object ConcreteIterator::CurrentItem()
{
 return _ag->GetItem(_idx);
}

void ConcreteIterator::First()
{
 _idx = 0;
}

void ConcreteIterator::Next()
{
 if (_idx < _ag->GetSize())
  _idx++;
}

bool ConcreteIterator::IsDone()
{
 return (_idx == _ag->GetSize());
}

代码片断5main.cpp
//main.cpp

#include "Iterator.h"
#include "Aggregate.h"

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
 Aggregate* ag = new ConcreteAggregate();

 Iterator* it = new ConcreteIterator(ag);

 for (; !(it->IsDone()) ; it->Next())
 {
  cout<<it->CurrentItem()<<endl;
 }

 return 0;
}

2.3.2 代码说明

       Iterator模式的实现代码很简单,实际上为了更好地保护Aggregate的状态,我们可以尽量减小Aggregatepublic接口,而通过将Iterator对象声明位Aggregate的友元来给予Iterator一些特权,获得访问Aggregate私有数据和方法的机会。

2.4 讨论

       Iterator模式的应用很常见,我们在开发中就经常会用到STL中预定义好的Iterator来对STL类进行遍历(VectorSet等)。

Posted on 2005-07-08 21:16  k_eckel's mindview  阅读(731)  评论(0编辑  收藏  举报