原文链接

#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++实现的更多相关文章

  1. 第3月第13天 cpp模版 Iterator模式 proactor

    1.模版除了传参,还可以自动创建.而传指针只是传参而已. template <class TYPE, class FUNCTOR, class ACE_LOCK, typename TIME_P ...

  2. Java 实现迭代器(Iterator)模式

    类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...

  3. 设计模式之Iterator模式

    STL里的iterator就是应用了iterator模式. 一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺 ...

  4. Java设计模式(12)迭代模式(Iterator模式)

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...

  5. 设计模式—迭代器Iterator模式

    什么是迭代器模式? 让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构. 首先我们先模仿集合中ArrayList和LinkedList的实现.一个是基于数组的实现.一个是基于链表的实现, ...

  6. 设计模式(一)Iterator模式

    Iterator模式用于在数据集合中按照顺序遍历集合.即迭代器模式. 下面来看一段实现了迭代器模式的示例程序. 这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显 ...

  7. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

  8. 【设计模式大法】Iterator模式

    Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...

  9. Java设计模式之Iterator模式

    分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...

  10. 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式

    1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...

随机推荐

  1. php 数据库备份(可用作定时任务)

    参考: https://blog.csdn.net/weixin_37616043/article/details/87721181 https://blog.csdn.net/stpeace/art ...

  2. thinkphp--导入导出xls文件

    /** * 数组转xls格式的excel文件 * @param array $data 需要生成excel文件的数组 * @param string $filename 生成的excel文件名 * 示 ...

  3. 牛客网练习赛61 A+B

    A.打怪 思路:先判定当小怪的攻击力为0时,你能杀无数只怪,因为小怪A不动你,然后再计算每个小怪最多能给你造成多少伤害(用小怪的血量除以你的攻击力,也就是你砍它几下它会死,你先手,所以小怪肯定比你少砍 ...

  4. MySQL不同存储引擎下optimize的用法

    optimize命令是mysql的常用优化命令,但是在InnoDB与MyISAM这两个存储引擎中却有很大的分别.本文将对这两个常用的存储引擎进行区分跟实例解析 1.查看mysql当前的存储引擎 一般情 ...

  5. Scala教程之:Option-Some-None

    文章目录 Option和Some Option和None Option和模式匹配 在java 8中,为了避免NullPointerException,引入了Option,在Scala中也有同样的用法. ...

  6. Spring Cloud 系列之 Stream 消息驱动(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Stream 消息驱动(一) 本篇文章讲解 Stream 如何实现消息分组和消息分区. 消息分组 如果有多个消息消费者 ...

  7. iOS逆向之一 工具的安装和使用

    iOS逆向之一-工具的安装和使用 最近在学习iOS安全方面的技术,有些东西就记录下来了,所有有了这篇文章.顺便也上传了DEMO,可以再这里找到这些DEMO的源码:dhar/iOSReProject 越 ...

  8. Django 内置分页的简单使用

    1, 文档 https://docs.djangoproject.com/en/1.11.1/topics/pagination/ 2,视图 from django.core.paginator im ...

  9. 【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板

    从2002年就开始接触Modbus协议,以后陆续在PLC.DOS.Windows..Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友 ...

  10. Hadoop学习笔记(一)——安装与配置

    操作系统:Ubuntu 15.04; Hadoop version: 2.6.4 参考文献: Ubuntu上搭建Hadoop环境(单机模式+伪分布模式)