设计模式读书笔记: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;
}
附加:
版权声明:本文为博主原创文章,未经博主允许不得转载。

leveldb源码剖析---迭代器设计

本篇主要介绍leveldb中的迭代器设计。迭代器设计封装了leveldb中的所有遍历操作。一个好的设计思想应该是:每个存在容器的地方,就应该有对应容器的迭代器的设计。leveldb是一个容器,leve...
  • Swartz2015
  • Swartz2015
  • 2017年05月08日 19:44
  • 512

[设计模式笔记]三. 行为型模式--18. Iterator模式(迭代器)对象行为型模式(一)

行为型模式--Iterator模式(迭代器)对象行为型模式 一. 意图             提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 二...
  • cay22
  • cay22
  • 2013年10月15日 12:01
  • 1495

C++设计模式——迭代器模式

前言 又到年底了,时间真的过的好快啊。最近也非常感伤,总是怀念大学的日子,做梦的时候也常常梦到。梦到大学在电脑前傻傻的敲着键盘,写着代码,对付着数据结构与算法的作业;建立一个链表,遍历链表,打印...
  • vipygd
  • vipygd
  • 2014年01月24日 23:23
  • 5249

设计模式初探-迭代器模式(ITERATOR)又称游标(Cursor)

迭代器模式(ITERATOR),又称游标(Cursor),提供了一种方法,用于顺序访问一个聚合对象中的各个元素,而不需暴露该对象的内部表示,属于对象行为型模式。迭代器模式通过将对聚合对象(通常为列表)...
  • a137268431
  • a137268431
  • 2014年03月03日 11:53
  • 1101

LevelDB 设计模式 Iterator模式

LevelDB 设计模式 Iterator模式flyfish 2015-10-9 Iterator模式(迭代器) 对象行为型模式 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需...
  • flyfish1986
  • flyfish1986
  • 2015年10月09日 10:27
  • 730

Java 实现迭代器(Iterator)模式

类图 /** * 自定义集合接口, 类似java.util.Collection * 用于数据存储 * @author stone * */ public interface IColl...
  • jjwwmlp456
  • jjwwmlp456
  • 2014年10月11日 12:21
  • 4577

设计模式(行为型)之迭代器模式(Iterator Pattern)

在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上...
  • yanbober
  • yanbober
  • 2015年05月05日 09:25
  • 2641

Android设计模式源码解析之迭代器(Iterator)模式

1. 模式介绍 模式的定义 迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该...
  • u010405231
  • u010405231
  • 2015年11月03日 16:48
  • 592

在JAVA中 迭代器Iterator的具体含义和用法!

list l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); for (Iterator iter = l.iterator...
  • qq_29061341
  • qq_29061341
  • 2016年05月03日 09:16
  • 2083

C++ 自定义迭代器

程序员可以根据需要定义自己的迭代器。MyIterator //print.h #include #include template inline void PRINT_ELEMENTS(cons...
  • Slience_Perseverance
  • Slience_Perseverance
  • 2014年03月12日 19:44
  • 3637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:Iterator(迭代器)
举报原因:
原因补充:

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