// // // // // // // // //
///2013.3.4
// // // // // // // // //
如果说有一个设计模式不需要任何讲解的话,
估计就是这个了。
Iterator。
它的身影出现在STL的各种容器中。
作用及使用方法无需赘述。
【核心】这货就是一个迭代器。
UML图:
代码部分
【大致思路】
WordsReader作为一个词汇解读器,内部存储一个字符串。
Iterator可以对此字符串以此迭代,获取每个字符。
Aggregate.h
#ifndef _AGGREGATE_H_
#define _AGGREGATE_H_
class Iterator;
class Aggregate
{
public:
Aggregate(){}
~Aggregate(){}
virtual char* getWords() = 0;
virtual Iterator* concreteIterator() = 0;
};
class WordsReader: public Aggregate
{
public:
WordsReader(const char* words);
~WordsReader(){}
Iterator* concreteIterator();
char* getWords();
private:
char* words;
};
#endif
Aggregate.cpp
#include "Aggregate.h"
#include "Iterator.h"
#include<string>
WordsReader::WordsReader(const char* w)
{
words = new char[MAX_SIZE];
strcpy(words,w);
}
Iterator* WordsReader::concreteIterator()
{
return new ConcreteIterator(this);
}
char* WordsReader::getWords()
{
return words;
}
Iterator.h
#ifndef _ITERATOR_H_
#define _ITERATOR_H_
#define MAX_SIZE 20
class Aggregate;
class Iterator
{
public:
Iterator(){}
~Iterator(){}
virtual char First() = 0;
virtual char Next() = 0 ;
virtual char Current() = 0;
protected:
int currentIndex;
};
class ConcreteIterator:public Iterator
{
public:
ConcreteIterator(Aggregate* aggregate);
~ConcreteIterator(){}
char First();
char Next() ;
char Current();
private:
char charAssemble[MAX_SIZE];
};
#endif
Iterator.cpp
#include "Iterator.h"
#include "Aggregate.h"
ConcreteIterator::ConcreteIterator(Aggregate* aggregate)
{
char* message = aggregate->getWords();
int length = 0;
while (message[length] != '\0')
{
length++;
}
for(int i = 0;i < length;i++)
charAssemble[i] = message[i];
currentIndex = 0;
}
char ConcreteIterator::First()
{
currentIndex = 0;
return charAssemble[currentIndex];
}
char ConcreteIterator::Next()
{
currentIndex++;
return charAssemble[currentIndex];
}
char ConcreteIterator::Current()
{
return charAssemble[currentIndex];
}
main.cpp
#include "Aggregate.h"
#include "Iterator.h"
#include<iostream>
using namespace std;
int main()
{
Aggregate* words;
Iterator* iterator;
words = new WordsReader("Happy New Year");
iterator = words->concreteIterator();
cout<<"The 1st char is:"<<iterator->First()<<endl;
cout<<"The 2nd char is:"<<iterator->Next()<<endl;
cout<<"The 3rd char is:"<<iterator->Next()<<endl;
int i = 4;
do
{
cout<<"The "<<i<<"th char is:"<<iterator->Next()<<endl;
}while (i++ < 10);
return 0;
}
输出结果:
、
【注意事项】
虽然这个示例比较简单,
只是对字符串进行迭代,
但是Iterator的大致模式即是如此。
作为更常使用STL_Container的迭代器的我们,
也一定要掌握这种比较基本的设计模式。
这样以后我们自己制作集合类的时候,
就显得非常方便啦。
除此之外,
大家还要注意一个细节,
就是字符数组(本质为字符指针),
访问它是有越界的危险的,
因此在这里我使用了一个小技巧用来判断动态字符数组的长度:
int length = 0;
while (message[length] != '\0')
{
length++;
}
跬步以至千里,
小流而成江河。
与君互勉。