1. 程式人生 > >《設計模式》學習筆記——迭代器模式

《設計模式》學習筆記——迭代器模式

        迭代器模式(Iterator Pattern)用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。迭代器模式屬於行為型模式。

IteratorPattern.h

#pragma once
#include<iostream>
#include<string>

// 模擬物件
typedef int Object;
#define SIZE 5

// 自定義迭代器介面,抽象層
class MyIterator
{
public:
	virtual void First(void) = 0;			// 指向第一個元素
	virtual void Next(void) = 0;			// 指向下一個元素
	virtual bool IsDone(void) = 0;			// 是否已經結束了
	virtual Object CurrentItem(void) = 0;	// 獲取當前項
private:
protected:
};

// 抽象容器,介面
class Aggregate
{
public:
	// 建立迭代器
	virtual MyIterator* CreateIterator() = 0;
	// 獲取容器大小
	virtual int getSize(void) = 0;
	// 獲取元素
	virtual Object getItem(int index) = 0;
private:
protected:
};

// 具體的迭代器
class ContreteIterator:public MyIterator
{
public:
	ContreteIterator(Aggregate* aggregate,int index=0):m_aggregate(aggregate),m_currentIndex(index){}
	virtual void First(void)// 指向第一個元素
	{
		m_currentIndex = 0;			// 當前遊標置0
	}
	virtual void Next(void)// 指向下一個元素
	{
		if (m_currentIndex < m_aggregate->getSize())
		{
			m_currentIndex++;
		}
			
	}		
	virtual bool IsDone(void)// 是否已經結束了
	{
		return (m_currentIndex == m_aggregate->getSize());
	}		
	virtual Object CurrentItem(void)// 獲取當前項
	{
		return m_aggregate->getItem(m_currentIndex);
	}
private:
	int m_currentIndex;					// 當前位置
	Aggregate* m_aggregate;				// 指向容器的指標

protected:
};

// 具體的容器
class ContreteAggregate:public Aggregate
{
public:
	ContreteAggregate() 
	{
		for (int i = 0; i < SIZE; i++)
			object[i] = i;
	}
	// 建立迭代器
	virtual MyIterator* CreateIterator()
	{
		return new ContreteIterator(this);
	}
	// 獲取容器大小
	virtual int getSize(void)
	{
		return SIZE;
	}
	// 獲取元素
	virtual Object getItem(int index)
	{
		return object[index];
	}
private:
	Object object[SIZE];				// 對應的底層資料
protected:
};

class IteratorPattern
{
public:
	IteratorPattern() {};
	~IteratorPattern() {};
};

IteratorPattern.cpp

#include "IteratorPattern.h"

mainTest.cpp

#include<iostream>
#include<string>
#include "IteratorPattern.h" 

int main(void)
{
	// 建立一個集合
	ContreteAggregate* contreteAggregate = new ContreteAggregate;
	// 建立一個迭代器
	MyIterator* myIterator= contreteAggregate->CreateIterator();

	for (;!(myIterator->IsDone()); myIterator->Next())
	{
		std::cout<< myIterator->CurrentItem()<<" "<<std::endl;
	}

	delete myIterator;
	delete contreteAggregate;
	system("pause");
	return 0;
}