《设计模式》学习笔记——迭代器模式

46 篇文章 1 订阅
27 篇文章 0 订阅

        迭代器模式(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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值