定义

提供一个方法顺序訪问一个聚合对象中个各个元素,而又不须要暴露该对象的内部结构。

案例
一个聚合对象。如一个列表List。应该提供一种方法来让别人能够訪问它的元素。而又不用暴露内部结构。迭代器模式能够非常好的解决这类问题,关键思想就是将队列表的訪问和遍历从列表对象中分离出来,放到一个迭代器Iterator对象中。Iterator定义了一个訪问List对象的接口。



AbstractList提供了List的基本接口:
  1. template<class Item>
  2. class AbstractList {
  3. public:
  4. virtual Iterator* createIterator() const = 0;
  5. virtual int count() const = 0;
  6. virtual void append(Item item) = 0;
  7. virtual void remove(Item item) = 0;
  8. virtual void get(Int index) = 0;
  9. };
在其子类中实现相关操作:
  1. template<class Item>
  2. class ListOne : public AbstractList {
  3. public:
  4. virtual Iterator* createIterator() const;
  5. ...
  6. };
  7. Iterator* ListOne::createIterator() {
  8. return new IteratorOne<Item>(this);
  9. }
Iterator类提供公有接口来支持迭代:
  1. template<class Item>
  2. class Iterator {
  3. public:
  4. virtual void first() = 0;
  5. virtual void next() = 0;
  6. virtual bool isEnd() const = 0;
  7. virtual Item current() const = 0;
  8. proteced:
  9. Iterator();
  10. };
子类进行详细操作的实现:
  1. template<class Item>
  2. class IteratorOne : public Iterator {
  3. public:
  4. IteratorOne(const ListOne<Item>* list);
  5. virtual void first();
  6. virtual void next();
  7. virtual bool isEnd() const;
  8. virtual Item current() const;
  9. private:
  10. ListOne<Item>* m_list;
  11. int m_index;
  12. };
  13. template<class Item>
  14. void IteratorOne::first() {
  15. m_index = 0;
  16. }
  17. template<class Item>
  18. void IteratorOne::next() {
  19. ++m_index;
  20. }
  21. template<class Item>
  22. bool IteratorOne::isEnd() const {
  23. return m_index == m_list->count();
  24. }
  25. tempalte<class Item>
  26. Item IteratorOne::current() const {
  27. if(isEnd())
  28. throw IteratorOutOfBounds();
  29. return m_list->get(m_index);
  30. }
比方如今我们要打印Book类的一个List的书名:
  1. ListOne<Book*> books;
  2. IteratorOne<Book*>* iter = books.createIterator();
  3. for(iter->first(); !iter->isEnd(); iter->next()) {
  4. std::cout << iter->current()->print();
  5. }
  6. delete iter;
这样实现必须保证每次迭代器都被删除,能够定义一个IteratorPtr来确保对象被释放:
  1. template<class Item>
  2. class IteratorPtr {
  3. public:
  4. IteratorPtr(Iterator<Item>* iter) : m_iter(iter) {}
  5. ~IteratorPtr() { delete m_iter; }
  6. Iterator<Item>* operator->() { returm m_iter; }
  7. Iterator<Item>* operator*() { return *m_iter; }
  8. private:
  9. Iterator<Item>* m_iter;
  10. }
  1. ListOne<Book*> books;
  2. IteratorPtr<Book*> iter(books.createIterator());
  3. for(iter->first(); !iter->isEnd(); iter->next()) {
  4. std::cout << iter->current()->print();
  5. }
以上是迭代器的一种外部实现方式。另一种内部实现方式:
  1. template<class Item>
  2. class ListTraverser {
  3. public:
  4. ListTravrerser(ListOne<Item>* list);
  5. void traverse();
  6. proteced:
  7. virtual void processItem(const Item&) = 0;
  8. private:
  9. IteratorOne<Item> m_iter;
  10. };
  11. void ListTraverser::traverse() {
  12. bool result = false;
  13. for(m_iter.first(); !m_iter.isEnd(); m_iter.next()) {
  14. processItem(m_item.current());
  15. }
  16. }
假设是Book对象的迭代操作,就能够定义一个BookTraverser类。实现processItem函数:
  1. void BookTraverse::processItem(const Book* book) {
  2. cout << book;
  3. }
  1. List<Book> books;
  2. BookTraverse bt(books);
  3. bt.traverse();
适用性
  • 訪问一个集合对象的内容而无须要暴露它的内部展示
  • 支持对集合对象的多种遍历
  • 为遍历不同的集合结构提供一个统一的接口

Iterator - 迭代器模式的更多相关文章

  1. [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  2. [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  3. 设计模式17:Iterator 迭代器模式(行为型模式)

    Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...

  4. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  5. 设计模式(16)--Iterator(迭代器模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 迭代模式又叫游标(Cursor)模式,是对象的行为模式.迭代模式可以顺序地访问一个聚集中的元素而不 ...

  6. Iterator 迭代器模式 MD

    迭代器模式 简介 Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问[委让]给外部类,使用Iterator按顺序进行遍历访问. 在程序设计中,经常有这种情况:需要从大量的数据集合中一 ...

  7. [C++设计模式] iterator 迭代器模式

    迭代器模式定义:提供一种方法顺序訪问一个聚合对象中各个元素,而又不须要暴露该对象. 迭代器分内部迭代器和外部迭代器.内部迭代器与对象耦合紧密,不推荐使用. 外部迭代器与聚合容器的内部对象松耦合,推荐使 ...

  8. 设计模式C++学习笔记之十四(Iterator迭代器模式)

      14.1.解释 概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. main(),客户 IProject,产品接口 CProject,产品类 IIterator,迭代 ...

  9. Iterator(迭代器模式)--(超市管理者)

    这个Iterator就是收银台干的活. package patterns.actions.iterator; public interface IteratorList { boolean isEmp ...

随机推荐

  1. 图的最短路径Dijkstra

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> #i ...

  2. js仿新浪游戏频道导航条

    js仿新浪游戏频道导航条 在线演示本地下载

  3. Django学习案例一(blog):六. 开发博客内容页面

    目标:某条博客具体内容的展示,可返回博客主页面,可进行评论. 1. 编辑路由 一篇博客,要将其找出来,就需要有一个唯一的标识.Django 的模型中默认有一个唯一的且未自增长的主键,即 id 字段.我 ...

  4. 设计模式之合成模式(Java语言描述)

    <JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做"部分--整体"模式.合成模式将对象组织到树结构中,可以 ...

  5. Unity引擎GUI之Canvas和EventSystem

    最近想写一套关于UGUI所有控件的基础使用教程系列,主要是根据本人的使用心得以及部分测试附带字面翻译来写的,所以其中可能难以避免会有不正确的地方. 好了进入主题,既然是第一篇,我觉得我有必要先介绍一下 ...

  6. Deutsch lernen (10)

    Dieser Weg Dieser Weg wird kein leichter sein. Dieser Weg wird steinig und schwer. Nicht mit vielen ...

  7. 如何安全使用dispatch_sync

    概述 iOS开发者在与线程打交道的方式中,使用最多的应该就是GCD框架了,没有之一.GCD将繁琐的线程抽象为了一个个队列,让开发者极易理解和使用.但其实队列的底层,依然是利用线程实现的,同样会有死锁的 ...

  8. MAMP PRO mysql无法启动

    mac上可能勾选了软件自动更新,然后MAMP PRO 升级了. 升级了之后,mysql启动就出问题了,看报错日志: InnoDB: The error means the system cannot ...

  9. " \t\r\n\f"是什么意思

    空格字符 \t 制表符 \r 回车符 \n 换行符 \f 换页符

  10. shell 结合expect实现ssh登录并执行命令

    #!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...