设计模式读书笔记:Iterator(迭代器)

原创 2015年07月10日 20:55:29

意图:

提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

结构图:来自 《23种设计模式 - 郗晓勇》


实现:https://github.com/panshiqu/patterns/tree/master/Iterator

AbstractList

#include "Iterator.h"

namespace NS_ITERATOR {

template <class Item>
class AbstractList {
public:
	AbstractList() {}
	virtual ~AbstractList() {}
	virtual long getCount(void) const = 0;
	virtual Item getItem(long index) const = 0;
	virtual Iterator<Item> *createIterator(void) const = 0;
};

} /* namespace NS_ITERATOR */
List

#include "AbstractList.h"
#include "ListIterator.h"

namespace NS_ITERATOR {

template <class Item>
class List : public AbstractList<Item> {
public:
	List()
	{
		for (int i = 0; i < 10; i++)
			_items[i] = i;
	}
	virtual ~List() {}
	virtual long getCount(void) const;
	virtual Item getItem(long index) const;
	virtual Iterator<Item> *createIterator(void) const;

private:
	Item _items[10];
};

template <class Item>
long List<Item>::getCount(void) const {
	return 10;
}

template <class Item>
Item List<Item>::getItem(long index) const {
	return _items[index];
}

template <class Item>
Iterator<Item> *List<Item>::createIterator(void) const {
	return new ListIterator<Item>(this);
}

} /* namespace NS_ITERATOR */
Iterator

namespace NS_ITERATOR {

template <class Item>
class Iterator {
public:
	Iterator() {}
	virtual ~Iterator() {}
	virtual void first(void) = 0;
	virtual void next(void) = 0;
	virtual bool isDone(void) const = 0;
	virtual Item currentItem(void) const = 0;
};

} /* namespace NS_ITERATOR */
ListIterator

#include "Iterator.h"
#include "AbstractList.h"

namespace NS_ITERATOR {

template <class Item>
class ListIterator : public Iterator<Item> {
public:
	ListIterator(const AbstractList<Item> *aList);
	virtual ~ListIterator() {}
	virtual void first(void);
	virtual void next(void);
	virtual bool isDone(void) const;
	virtual Item currentItem(void) const;

private:
	const AbstractList<Item> *_list;
	long _current;
};

template <class Item>
ListIterator<Item>::ListIterator(const AbstractList<Item> *aList) : _list(aList), _current(0) {}

template <class Item>
void ListIterator<Item>::first(void) {
	_current = 0;
}

template <class Item>
void ListIterator<Item>::next(void) {
	_current++;
}

template <class Item>
bool ListIterator<Item>::isDone(void) const {
	return _current >= _list->getCount();
}

template <class Item>
Item ListIterator<Item>::currentItem(void) const {
	return _list->getItem(_current);
}

} /* namespace NS_ITERATOR */
IteratorPtr

#include "Iterator.h"

namespace NS_ITERATOR {

template <class Item>
class IteratorPtr {
public:
	IteratorPtr(Iterator<Item> *i) : _i(i) {}
	virtual ~IteratorPtr() { delete _i; }
	Iterator<Item> *operator->()	{ return _i; }

private:
	Iterator<Item> *_i;
};

} /* namespace NS_ITERATOR */
main

#include <iostream>
#include "Iterator/List.h"
#include "Iterator/ListIterator.h"
#include "Iterator/IteratorPtr.h"
using namespace NS_ITERATOR;
int main(void)
{
	List<int> lt;
	IteratorPtr<int> li(lt.createIterator());
	for (li->first(); !li->isDone(); li->next())
		std::cout << li->currentItem() << std::endl;
}
附加:

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

设计模式读书笔记-----迭代器模式

你项目组接到一个项目:对电视机的电视频道、电影和收音机菜单进行统一管理,建立一个统一的菜单管理界面,能够看到所有的电视界面、电影界面和收音机频道。你有三个手下:小李子、小杏子、小安子,他们分别就每个模...

《HeadFirst设计模式》读书笔记-第9章-迭代器模式

定义 迭代器模式(iterator pattern)提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露其内部的表示。 迭代器模式把遍历集合内元素的操作交给了迭代器,而集合本身专注在管理元素,...
  • rex_nie
  • rex_nie
  • 2017年04月24日 08:26
  • 189

设计模式C++学习笔记之十四(Iterator迭代器模式)

设计模式C++学习笔记之十四(Iterator迭代器模式) 14.1.解释 概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。 main(),客户 IProj...

设计模式笔记12:迭代器模式(Iterator Pattern)

一、迭代器模式的内容 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的标示。其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。 从定义可见,迭代器模式是为容器...

设计模式 笔记 迭代器模式 Iterator

//---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型...
  • boydfd
  • boydfd
  • 2015年04月27日 07:41
  • 671

【设计模式】学习笔记12:迭代器模式(Iterator)

走进迭代器模式 迭代器几乎是最常用的一种设计模式,在各面向对象语言中都有实现。 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露出其内部的表示。 迭代器模式能够让我们游走于聚合内的...

设计模式C++学习笔记之十四(Iterator迭代器模式)

博文很精彩,为方便个人学习特转载,地址:http://www.cnblogs.com/wanggary/archive/2011/04/19/2021600.html 14.1.解释 ...
  • phiall
  • phiall
  • 2016年03月17日 22:52
  • 174

设计模式C++学习笔记之三(Iterator迭代器模式)

概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。 main(),客户 IProject,产品接口 CProject,产品类 IIterator,迭代器接口 IProj...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:Iterator(迭代器)
举报原因:
原因补充:

(最多只允许输入30个字)