// // // // // // // // //
///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++; }
跬步以至千里,
小流而成江河。
与君互勉。