Iterator模式C++实现
#include <iostream>
using namespace std;
typedef int DATA;
class Iterator;
// 容器的抽象基类
class Aggregate {
public:
virtual ~Aggregate(){}
virtual Iterator* CreatIterator(Aggregate *pAggregate)=0;
virtual int GetSize()=0;
virtual DATA GetItem(int nIndex)=0;
};
// 迭代器的抽象基类
class Iterator {
public:
virtual ~Iterator(){}
virtual void First()=0;
virtual void Next()=0;
virtual bool IsDone()=0;
virtual DATA CurrentItem()=0;
};
// 一个具体的容器类
class ConcreteAggregate : public Aggregate {
public:
ConcreteAggregate(int nSize);
virtual ~ConcreteAggregate();
virtual Iterator* CreatIterator(Aggregate *pAggregate);
virtual int GetSize();
virtual DATA GetItem(int nIndex);
private:
int m_nSize;
DATA *m_pData;
};
// 访问ConcreteAggregate容器的迭代器类
class ConcreteIterator : public Iterator {
public:
ConcreteIterator(Aggregate* pAggreagte);
virtual ~ConcreteIterator();
virtual void First();
virtual void Next();
virtual bool IsDone();
virtual DATA CurrentItem();
private:
Aggregate *m_pConcreteAggregate;
int m_nIndex;
};
// ConcreteAggregate
ConcreteAggregate::ConcreteAggregate(int nSize) : m_nSize(nSize), m_pData(NULL) {
m_pData = new DATA[m_nSize];
for (int i = 0; i < m_nSize; ++i) {
m_pData[i] = i;
}
}
ConcreteAggregate::~ConcreteAggregate() {
delete [] m_pData;
m_pData = NULL;
}
Iterator* ConcreteAggregate::CreatIterator(Aggregate *pAggregate) {
return new ConcreteIterator(this);
}
int ConcreteAggregate::GetSize() {
return m_nSize;
}
DATA ConcreteAggregate::GetItem(int nIndex) {
if (nIndex < m_nSize) {
return m_pData[nIndex];
}
else {
return -1;
}
}
// ConcreteIterator
ConcreteIterator::ConcreteIterator(Aggregate* pAggreagte) : m_pConcreteAggregate(pAggreagte), m_nIndex(0) {
}
ConcreteIterator::~ConcreteIterator() {
if (!m_pConcreteAggregate) delete m_pConcreteAggregate;
}
void ConcreteIterator::First() {
m_nIndex = 0;
}
void ConcreteIterator::Next() {
if (m_nIndex < m_pConcreteAggregate->GetSize()) {
++m_nIndex;
}
}
bool ConcreteIterator::IsDone() {
return m_nIndex == m_pConcreteAggregate->GetSize();
}
DATA ConcreteIterator::CurrentItem() {
return m_pConcreteAggregate->GetItem(m_nIndex);
}
int main() {
Aggregate * pAggregate = new ConcreteAggregate(10);
for (Iterator * pIterator = new ConcreteIterator(pAggregate); !pIterator->IsDone(); pIterator->Next()) {
cout << pIterator->CurrentItem() << endl;
}
return 0;
}
Iterator模式C++实现的更多相关文章
- 第3月第13天 cpp模版 Iterator模式 proactor
1.模版除了传参,还可以自动创建.而传指针只是传参而已. template <class TYPE, class FUNCTOR, class ACE_LOCK, typename TIME_P ...
- Java 实现迭代器(Iterator)模式
类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...
- 设计模式之Iterator模式
STL里的iterator就是应用了iterator模式. 一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺 ...
- Java设计模式(12)迭代模式(Iterator模式)
上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...
- 设计模式—迭代器Iterator模式
什么是迭代器模式? 让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构. 首先我们先模仿集合中ArrayList和LinkedList的实现.一个是基于数组的实现.一个是基于链表的实现, ...
- 设计模式(一)Iterator模式
Iterator模式用于在数据集合中按照顺序遍历集合.即迭代器模式. 下面来看一段实现了迭代器模式的示例程序. 这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显 ...
- 设计模式C++描述----20.迭代器(Iterator)模式
一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...
- 【设计模式大法】Iterator模式
Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...
- Java设计模式之Iterator模式
分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...
- 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式
1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...
随机推荐
- css背景渐变色
张鑫旭关于渐变色博客 菜鸟教程关于渐变色 .img-box{ background: #ec9259; /* 一些不支持背景渐变的浏览器 */ background: -webkit-linear-g ...
- js点击事件,数字累加
<!doctype html><html lang="en"><head> <meta charset="utf-8&qu ...
- python学习19类5之多态与鸭子模型
'''''''''一.多态1.Python中多态是指一类事物有多种形态.''' class Animal: def run(self): raise AttributeError('子类必须实现这个方 ...
- linux find string in files
http://blog.csdn.net/duguduchong/article/details/7716908 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri ...
- 怎么将swagger API导出为HTML或者PDF
文章目录 将swagger API导出为HTML或者PDF 什么是Asciidoc swagger2markup-maven-plugin asciidoctor-maven-plugin 使用命令行 ...
- linux服务器(CentOS)一键安装express框架
express框架需要nodejs环境支持,没有安装node.js环境的同学可以参照下面这篇博客 linux服务器安装配置Node.js 好了,言归正传.先使用xshell或者其它软件连接我们的服务器 ...
- BurpSuite 扩展开发[1]-API与HelloWold
园长 · 2014/11/20 15:08 0x00 简介 BurpSuite神器这些年非常的受大家欢迎,在国庆期间解了下Burp相关开发并写了这篇笔记.希望和大家分享一下JavaSwing和Burp ...
- 啃算法:归并排序及JavaScript实现
在学习归并排序之前,有必要了解分治法,因为归并排序正是应用了分治模式.(基本定义摘自<算法导论>) 一.分治法 1.思想: 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些 ...
- Ngxin 开启CDN 日志获取不了真实IP的解决办法。
nginx配置里面在http{ 后加入如下两行代码即可: set_real_ip_from 0.0.0.0/0;real_ip_header X-Forwarded-For; 重启nginx生效. 注 ...
- 在Windows中快速配置vim
vim原本是在Linux中的编辑器,如果使用熟练写代码速度可以远高于其它编辑器 当然很多OI比赛也会要求在Linux中进行 然而: 想学Linux,首先要有一个Linux,但有了Linux,这个直播间 ...