【C++设计模式】迭代器模式

#ifndef __ITERATOR_H__
#define __ITERATOR_H__

#include <string>
#include <vector>

//【定义】
// 迭代器模式(Iterator):提供一种方法顺序访问一个集合对象中各个元素, 而又不需暴露该对象的内部表示。

//【角色】
// 1) 迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么两个方法:取得下一个元素的方法Next(),判断是否遍历结束的方法HasNext()
// 2) 具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。
// 3) 容器角色(Aggregate):一般是一个接口,提供一个GetIterator()方法。
// 4) 具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,

//【意义】
// 引入迭代器后可将遍历和实现分离开来。
// 访问一个聚合对象的内容而无需暴露它的内部表示。
// 为遍历不同的聚合结构提供一个统一的接口。

//【示例】

class iIterator;

//集合中的元素
class Book
{
public:
	Book(const std::string & name) : m_name(name){ }

	~Book(){ }

public:
	void SetName(std::string & name);

	std::string GetName();

private:
	std::string m_name;
};

//该角色负责定义创建Iterator的接口,个人感觉有时候可以不必引入该角色
class iAggregate
{
public:
	iAggregate(){ }

	virtual ~iAggregate(){ }

public:
	virtual iIterator * GetIterator() = 0;
};

//具体集合,负责实现创建Iterator的接口,该角色包含了遍历集合所必需的信息
class BookShelf : public iAggregate
{
public:
	BookShelf();

	~BookShelf();

	void Push(Book * book);

	Book * Pop();

	iIterator * GetIterator();

public:
	std::vector<Book*> m_BookVct;
};

//迭代器,该角色负责定义逐个遍历元素的接口
class iIterator
{
public:
	iIterator(){ }

	virtual ~iIterator(){ }

public:
	virtual int HasNext() = 0;

	virtual Book * Next() = 0;

};

//具体迭代器,该角色负责实现iIterator定义的接口
class BookShelfIterator : public iIterator
{
public:
	BookShelfIterator(BookShelf * bookshelf) : m_BookShelf(bookshelf), m_BookIndex(0){ }

	~BookShelfIterator(){ }

public:
	virtual int HasNext();

	virtual Book * Next();

private:
	BookShelf *  m_BookShelf;
	unsigned int m_BookIndex;
};

void TestIterator();


#endif

#include "Iterator.h"

void Book::SetName(std::string & name)
{
	m_name = name;
}

std::string Book::GetName()
{
	return m_name;
}

BookShelf::BookShelf()
{

}

BookShelf::~BookShelf()
{
	for (size_t i=0; i<m_BookVct.size(); i++)
	{
		delete m_BookVct[i];
	}
}

void BookShelf::Push(Book * book)
{
	m_BookVct.push_back(book);
}

Book * BookShelf::Pop()
{
	if (m_BookVct.empty())
	{
		return NULL;
	}

	Book * book = m_BookVct[m_BookVct.size()-1];
	m_BookVct.pop_back();

	return book;
}

iIterator * BookShelf::GetIterator()
{
	return new BookShelfIterator(this);
}

int BookShelfIterator::HasNext()
{
	if (m_BookShelf->m_BookVct.size() > m_BookIndex)
	{
		return 1;
	}

	return 0;
}

Book * BookShelfIterator::Next()
{
	Book * book = m_BookShelf->m_BookVct[m_BookIndex];
	m_BookIndex++;
	return book;
}

void TestIterator()
{
	Book * b1 = new Book(std::string("C++"));
	Book * b2 = new Book(std::string("Java"));
	Book * b3 = new Book(std::string("Scala"));

	BookShelf bookshelf;
	bookshelf.Push(b3);
	bookshelf.Push(b2);
	bookshelf.Push(b1);
	
	//这里的遍历过程不依赖于BookShelf的实现
	iIterator * iter = bookshelf.GetIterator();

	while (iter->HasNext())
	{
		Book * book = iter->Next();

		printf("BookName = %s \n", book->GetName().c_str());
	}

	delete iter;

	return;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值