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 ...
随机推荐
- webug3.0靶场渗透基础Day_1
第一关: 最简单的get注入 单引号报错 http://192.168.129.136/pentest/test/sqli/sqltamp.php?gid=1' order by 5 --+ ...
- Ubuntu 修改 hosts 文件
sudo vi /etc/hosts sudo /etc/init.d/networking restart
- hdu_1052 Tian Ji -- The Horse Racing 贪心
Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 运行node 报错 throw er; // Unhandled 'error' event
错误提示 此端口已被占用,改换其他端口
- dhcpd.conf(5) - Linux man page
http://linux.die.net/man/5/dhcpd.conf Name dhcpd.conf - dhcpd configuration file Description The d ...
- centos6安装创建kvm虚拟机
的虚拟机名 virsh domid name # 显示虚拟机id号 virsh domuuid name ...
- 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别
关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...
- SVN 部署(基于 Linux)
1.通过 yum 命令安装 svnserve,命令如下: # 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 yum -y install subversion # 若需查看 ...
- Nginx模块开发(4)————使用subrequest访问第三方服务
该模块可以完成如下的功能,当我们输入http://你的ip/lcw?s_sh000001时,会使用subrequest方式得到新浪服务器上的上证指数,代码如下: //start from the ve ...
- .NET Core 反编译dll源码查看
一.可以通过JetBrains dotPeek进行反编译 二.可以通过.NET Reflector和VS自带的反编译工具查看