// 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;
}
设计模式的迭代器模式 Iterator
最新推荐文章于 2023-11-11 07:00:00 发布