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

设计模式的迭代器模式 Iterator

2019年01月10日 ⁄ 综合 ⁄ 共 2404字 ⁄ 字号 评论关闭
// example9.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "string.h"


//定义一个学生类
class CStudent
{
public:
	CStudent()
	{
		m_number = 0;
		memset(m_name, 0, 10);
	};
	
	CStudent(int number, char* name)
	{
		m_number = number;
		strcpy_s(m_name, 10, name);
	};

	~CStudent(){};

	void output()
	{
		printf("number=%d name=%s\n", m_number, m_name);
	};

public:
	int m_number;
	char m_name[10];
};


//定义一个接口类,完成对迭代器的抽象定义
//为了对迭代器的访问,定义函数指针
class Iterator;
typedef void (*Visit)(Iterator*);

class Iterator
{
public:
	virtual void  first()=0;
	virtual void  next()=0;
	virtual bool  isend()=0;
	virtual void  output()=0;
	virtual void  use(Visit visit)=0;
};

//定义一个聚合抽象类,包含一个抽象迭代器
class Agressgate
{
public:
	virtual Iterator* createIterator()=0;
	virtual int getsize()=0;
	virtual void output(int index)=0;
	virtual Iterator* getitem(int index)=0;
};


//实现真正的迭代器
class ConcreteIterator: public Iterator
{
public:
	ConcreteIterator(Agressgate* pAgressgate)
	{
		m_pAgressgate = pAgressgate;
		m_index = 0;
	};

	void first() //指向第一个原色
	{
		m_index = 0;
	};

	void next() //游标自动前进一个
	{
		m_index++;
	};

	bool isend() //判断是否已经到了聚合类最后一个元素
	{
		return (m_index == m_pAgressgate->getsize());
	};

	void output()
	{
		m_pAgressgate->output(m_index);
	};

	void use(Visit visit)
	{
		visit(m_pAgressgate->getitem(m_index));
	};

private: 
	Agressgate* m_pAgressgate; //聚合类的指正
	int m_index; //真正的迭代器游标
};


//实现真正的聚合类
class ConcreteAggressgate: public Agressgate
{
public:
	ConcreteAggressgate()
	{
		m_currentpos = 0;
	};

	~ConcreteAggressgate(){};

public:
	Iterator* createIterator()
	{
		return new ConcreteIterator(this);
	};

	int getsize()
	{
		return m_currentpos;
	};

	void insert(CStudent stu)
	{
		if (m_currentpos < 100)
		{
			m_studentlist[m_currentpos] = stu;
			m_currentpos++;
		}
	};

	void output(int index)
	{
		m_studentlist[index].output();
	};

	Iterator* getitem(int index)
	{
		return (Iterator*)&m_studentlist[index];
	};

private:
	CStudent m_studentlist[100]; //聚合类的存储方式采用数组
	int m_currentpos; //聚合类目前存储元素的个数
};



//为了测试迭代器
void print(Iterator* LI)
{
	CStudent* pstu = (CStudent*)LI;
	pstu->output();
}

void swap(char* a, char* b)
{
	char temp = *a;
	*a = *b;
	*b = temp;
}

void conversestring(char* str)
{
	int length = strlen(str);
	for(int i = 0; i < length / 2; i++)
	{
		swap( str + i, str + length - i - 1); 
	}
}

//为了测试迭代器
void conversename(Iterator* LI)
{
	CStudent* pstu = (CStudent*)LI;
	conversestring(pstu->m_name);
}


int _tmain(int argc, _TCHAR* argv[])
{


	ConcreteAggressgate studentlist;
	
	CStudent stu1(1, "abcd");
	studentlist.insert(stu1);

	CStudent stu2(2, "asdf");
	studentlist.insert(stu2);


	CStudent stu3(3, "54321");
	studentlist.insert(stu3);

	Iterator* LI = studentlist.createIterator();
	LI->first();


	while(!LI->isend())
	{
		LI->use(print);
		LI->use(conversename);
		LI->output();
		LI->next();
	}

	getchar();

	return 0;
}

抱歉!评论已关闭.