现在的位置: 首页 > 综合 > 正文

【2013.3.4】迭代的真谛是一次次的积累以及坚持不懈。——Iterator

2018年10月09日 ⁄ 综合 ⁄ 共 2381字 ⁄ 字号 评论关闭

// // // // // // // // //

///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++;
}

跬步以至千里,

小流而成江河。

与君互勉。

抱歉!评论已关闭.