Iterator - 迭代器模式
定义

template<class Item>class AbstractList {public:virtual Iterator* createIterator() const = 0;virtual int count() const = 0;virtual void append(Item item) = 0;virtual void remove(Item item) = 0;virtual void get(Int index) = 0;
};
template<class Item>class ListOne : public AbstractList {public:virtual Iterator* createIterator() const;...};Iterator* ListOne::createIterator() {return new IteratorOne<Item>(this);}
template<class Item>class Iterator {public:virtual void first() = 0;virtual void next() = 0;virtual bool isEnd() const = 0;virtual Item current() const = 0;proteced:Iterator();};
template<class Item>class IteratorOne : public Iterator {public:IteratorOne(const ListOne<Item>* list);virtual void first();virtual void next();virtual bool isEnd() const;virtual Item current() const;private:ListOne<Item>* m_list;int m_index;};template<class Item>void IteratorOne::first() {m_index = 0;}template<class Item>void IteratorOne::next() {++m_index;}template<class Item>bool IteratorOne::isEnd() const {return m_index == m_list->count();}tempalte<class Item>Item IteratorOne::current() const {if(isEnd())throw IteratorOutOfBounds();return m_list->get(m_index);}
ListOne<Book*> books;IteratorOne<Book*>* iter = books.createIterator();for(iter->first(); !iter->isEnd(); iter->next()) {std::cout << iter->current()->print();}delete iter;
template<class Item>class IteratorPtr {public:IteratorPtr(Iterator<Item>* iter) : m_iter(iter) {}~IteratorPtr() { delete m_iter; }Iterator<Item>* operator->() { returm m_iter; }Iterator<Item>* operator*() { return *m_iter; }private:Iterator<Item>* m_iter;}
ListOne<Book*> books;IteratorPtr<Book*> iter(books.createIterator());for(iter->first(); !iter->isEnd(); iter->next()) {std::cout << iter->current()->print();}
template<class Item>class ListTraverser {public:ListTravrerser(ListOne<Item>* list);void traverse();proteced:virtual void processItem(const Item&) = 0;private:IteratorOne<Item> m_iter;};void ListTraverser::traverse() {bool result = false;for(m_iter.first(); !m_iter.isEnd(); m_iter.next()) {processItem(m_item.current());}}
void BookTraverse::processItem(const Book* book) {cout << book;}
List<Book> books;BookTraverse bt(books);bt.traverse();
- 訪问一个集合对象的内容而无须要暴露它的内部展示
- 支持对集合对象的多种遍历
- 为遍历不同的集合结构提供一个统一的接口
Iterator - 迭代器模式的更多相关文章
- [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- 设计模式17:Iterator 迭代器模式(行为型模式)
Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- 设计模式(16)--Iterator(迭代器模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 迭代模式又叫游标(Cursor)模式,是对象的行为模式.迭代模式可以顺序地访问一个聚集中的元素而不 ...
- Iterator 迭代器模式 MD
迭代器模式 简介 Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问[委让]给外部类,使用Iterator按顺序进行遍历访问. 在程序设计中,经常有这种情况:需要从大量的数据集合中一 ...
- [C++设计模式] iterator 迭代器模式
迭代器模式定义:提供一种方法顺序訪问一个聚合对象中各个元素,而又不须要暴露该对象. 迭代器分内部迭代器和外部迭代器.内部迭代器与对象耦合紧密,不推荐使用. 外部迭代器与聚合容器的内部对象松耦合,推荐使 ...
- 设计模式C++学习笔记之十四(Iterator迭代器模式)
14.1.解释 概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. main(),客户 IProject,产品接口 CProject,产品类 IIterator,迭代 ...
- Iterator(迭代器模式)--(超市管理者)
这个Iterator就是收银台干的活. package patterns.actions.iterator; public interface IteratorList { boolean isEmp ...
随机推荐
- C# 获取当月有多少天
int days = DateTime.DaysInMonth ( 2009, 9 ); int days = DateTime.DaysInMonth ( DateTime.Now.Year, Da ...
- caffe介绍
- [BZOJ1601] 灌水
难点:找到正确方式建图 知识点:Kruskal 分析:这种题肯定要把点权转换到边权上,但肯定无法搞到和其他点相连的边上,怎么办呢?那就再造一个点呗,这个“超级点”和所有点相连,且边权=点权,于是就可以 ...
- C#三种创建对象方法所需时间比较。。。。。
C#创建对象的三种方法 new().Activator.Assembly,接下来通过代码直接来看看运行的速度.... 首先,先看看三种创建对象实例的方法: //new(); public stati ...
- 5.29 @Value{name}无效时怎么办Could not resolve placeholder ‘name22’ in value “${name22}” 错误解决
springboot Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘name22’ in ...
- Windows7环境下Composer 安装包的Cache目录位置
http://segmentfault.com/a/1190000000355928 https://getcomposer.org/doc/ 要说Composer的用法,以后再说,现在只记录wind ...
- jQuery学习笔记之DOM操作、事件绑定(2)
jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...
- Ionic3 环境搭建以及基础配置实现(更新中)
GitHub:https://github.com/Teloi 环境配置输入以下命令安装 Ionic (如果刚才设置了淘宝镜像源,可以使用 cnpm 代替 npm):npm install -g io ...
- 附加MySQL数据库的方法
下面讲解附加MySQL数据库的方法. (1)将“光盘\Code\04\Project\数据库”文件夹中的扩展名为.sql的文件拷贝到本地机器中. (2)在如图1所示的MySQL工作台界面中,单击Dat ...
- 图方法:寻找无向图联通子集的JAVA版本
图像处理中一般使用稠密方法,即对图像进行像素集合进行处理.在图像拓扑方面,更多地应用图计算方法. 寻找无向图联通子集的JAVA版本,代码: //查找无向图的所有连通子集//wishchin!!! pu ...