迭代器模式C++实现

1定义

他提供一种方法访问一个容器对象中的各个元素,而不暴漏该对象内部细节

注:迭代器是为容器服务的。迭代器模式提供了遍历容器的方便性,容器只管理增减元素就好,需要遍历时交给迭代器就好。

2类图

角色分析

Iterator抽象迭代,定义访问和遍历元素的接口,一般都是固定接口:first,next,IsDone/last

ConcreteIterator具体迭代器,实现迭代器接口,完成容器元素的遍历

Aggregate抽象容器,负责提供具体迭代器角色的接口,必然提供一个CreateIterator的方法。

ConcreteAggregate具体容器,实现接口定义的方法,创建出容纳迭代器的对象

3实现

class Iterator;
typedef int Object;
class Interator;
class Aggregate
{
public:
  virtual ~Aggregate();
  virtual Iterator* CreateIterator() = 0;
  virtual Object GetItem(int idx) = 0;
  virtual int GetSize() = 0;
protected:
  Aggregate();
private:
};

class ConcreteAggregate:public Aggregate
{
public:
  enum {SIZE = 3};
  ConcreteAggregate();
  ~ConcreteAggregate();
  Iterator* CreateIterator();
  Object GetItem(int idx);
  int GetSize();
protected:

private:
  Object _objs[SIZE];
};

#include <iostream>
using namespace std;
Aggregate::Aggregate()
{
}
Aggregate::~Aggregate()
{
}
ConcreteAggregate::ConcreteAggregate()
{
  for (int i = 0; i < SIZE; i++)
  _objs[i] = i;
}
ConcreteAggregate::~ConcreteAggregate()
{
}
Iterator* ConcreteAggregate::CreateIterator()
{
  return new ConcreteIterator(this);
}
Object ConcreteAggregate::GetItem(int idx)
{
  if (idx < this->GetSize())
  return _objs[idx];
else

  return -1;

}
int ConcreteAggregate::GetSize()
{
  return SIZE;
}

class Aggregate;
typedef int Object;
class Iterator
{
public:
  virtual ~Iterator();
  virtual void First() = 0;
  virtual void Next() = 0;
  virtual bool IsDone() = 0;
  virtual Object CurrentItem() = 0;
protected:
  Iterator();
private:
};
class ConcreteIterator:public Iterator
{
public:
  ConcreteIterator(Aggregate* ag , int idx = 0);
  ~ConcreteIterator();
  void First();

  void Next();
  bool IsDone();
  Object CurrentItem();
protected:
private:
  Aggregate* _ag;
  int _idx;
};

Iterator::Iterator()
{
}
Iterator::~Iterator()
{
}
ConcreteIterator::ConcreteIterator(Aggregate* ag , int idx)
{
  this->_ag = ag;
  this->_idx = idx;
}
ConcreteIterator::~ConcreteIterator()
{
}

Object ConcreteIterator::CurrentItem()
{
  return _ag->GetItem(_idx);
}
void ConcreteIterator::First()
{
  _idx = 0;
}
void ConcreteIterator::Next()
{
  if (_idx < _ag->GetSize())
  _idx++;
}
bool ConcreteIterator::IsDone()
{
  return (_idx == _ag->GetSize());
}

设计模式--迭代器模式C++实现的更多相关文章

  1. 19. 星际争霸之php设计模式--迭代器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. java设计模式——迭代器模式

    一. 定义与类型 定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示 类型:行为型. 二. 使用场景 (1) 访问一个集合对象的内容而无需暴露它的内部表示 (2)  为遍 ...

  3. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  4. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构

  5. 深入浅出设计模式——迭代器模式(Iterator Pattern)

    模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我 ...

  6. JavaScript设计模式 - 迭代器模式

    迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...

  7. javascript设计模式-迭代器模式(Iterator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 设计模式 --迭代器模式(Iterator)

    能够游走于聚合内的每一个元素,同时还可以提供多种不同的遍历方式.   基本概念: 就是提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示.   使用迭代器模式的优点: 遍历集合或者数 ...

  9. js设计模式--迭代器模式

    迭代器模式: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示.js中我们经常会封装一个each函数用来实现迭代器. 理解的意思:提供一个方法,去把对象的每一项按 ...

  10. javascript设计模式——迭代器模式

    前面的话 迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也 ...

随机推荐

  1. 利用crontab系统每天定时备份MySQL数据库及删除指定crontab定时任务

    利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的. 1.创建保存备份文件的路径/mysqldata mkdir /mysqldata 2.创建/usr/sbin/ba ...

  2. 批处理delims分割时遇到的问题。。

    今天写了个将文件每行按逗号分割并取第六行的批处理.但是结果不对.看图一目了然. for 循环的/f 后面的参数是这样的 然后文件的内容是这样的 亮点是倒数第二行..其实6才是第六列的值.其他行第六列都 ...

  3. std::decay

    参考资料 • cplusplus.com:http://www.cplusplus.com/reference/type_traits/decay/ • cppreference.com:http:/ ...

  4. Python3 安装第三方包

    打开cmd(切记是cmd,不是Python3.6那个敲代码环境)输入 pip3 install numpy 即可(安装numpy包)

  5. [笔记] Ubuntu 18.04安装Docker CE及nvidia-docker2流程

    Docker的好处之一,就是在Container里面可以随意瞎搞,不用担心弄崩Host的环境. 而nvidia-docker2的好处是NVidia帮你配好了Host和Container之间的CUDA相 ...

  6. XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal

    题目:Problem J. TerminalInput file: standard inputOutput file: standard inputTime limit: 2 secondsMemo ...

  7. MVC[xml]页面传值

    MVC 各种传值方式 ViewData传值.HomeController.cs Co de: public ActionResult Index(){      ViewData["Titl ...

  8. 【android】通过leakCanary找出程序内存泄露点

    背景 内存泄露是咱新手比较头痛的问题,因为它不像崩溃,在开发环境可以根据提示的错误信息排查问题. 你都不知道咱的app是否哪个犄角旮旯藏着一个吞噬内存的黑洞. 排查android 内存泄露比较底层高端 ...

  9. 【转】js获取当前日期时间“yyyy-MM-dd HH:MM:SS”

    获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS”   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function getNowFormatD ...

  10. JVM性能调优(转)

    本文转自:http://www.cnblogs.com/chen77716/archive/2010/06/26/2130807.html 最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现 ...