前一篇主要介绍了容器类和Visitor Pattern,本篇将学习另一种与容器有关的重要的辅助类——Iterator,以及Iterator Pattern。
一、迭代器(Iterator)
Iterator是与容器伴生的辅助类,它提供一种逐个访问容器中元素的方法抽象,跨越了容器的具体类型(数组、链表等),也有人说它是一种广义指针。类Iterator的接口定义如下:
#ifndef ITERATOR_H
#define ITERATOR_H
class Object;
class Iterator
{
public:
virtual ~Iterator() {}
virtual void Reset() = 0;
virtual bool IsDone() const = 0;
virtual Object& operator * () const = 0;
virtual void operator ++() = 0;
};
#endif // ITERATOR_H
观察Iterator的接口可知,它主要用于遍历容器,为循环而生:“IsDone函数”是循环测试条件,“++操作”是循环移动,此外它还有解引用操作。
二、The NullIterator Class
为了使编程(操作)的一致,我们还设计了空迭代器类。它是一个具体的类。代码如下:
#pragma once
#include "Iterator.h"
class Object;
class NullIterator :
public Iterator
{
public:
NullIterator();
void Reset();
bool IsDone() const;
Object & operator * () const;
void operator++();
};
#include "stdafx.h"
#include "NullIterator.h"
#include "NullObject.h"
NullIterator::NullIterator()
{
}
void NullIterator::Reset()
{
}
bool NullIterator::IsDone() const
{
return true;
}
Object & NullIterator::operator*() const
{
return NullObject::Instance();
}
void NullIterator::operator++()
{
}
三、Visitor vs Iterator
Visitor的封装性更好,也更简单。Iterator的功能更强大,扩展性更好。