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 ...
随机推荐
- javaweb 课程设计编码和设计文档
企业办公软件设计文档 1引言 1.1编写目的 OA办公自动化系统详细设计是设计的第三个阶段,这个阶段的主要任务是在OA办公自动化系统概要设计书基础上,对概要设计中产生的功能模块进行过程描述,设计功能模 ...
- Visual Studio q启动卡顿
在开发人员CMD下面执行 Devenv.exe /ResetSettings ,然后顺利打开 总发现vs2015经常把cpu给占满了,导致电脑卡的不要不要的.这是CodeLens引起的,因为装了VAs ...
- 树莓派-基于raspivid实现拍视频
经过上一篇<<树莓派-安装摄像头模块>>之后 想要用摄像头模块拍一段视频的话,可以从命令行运行 raspivid 工具.下面这句命令会按照默认配置(长度5秒,分辨率1920x1 ...
- 自学Python四 爬虫基础知识储备
首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏 和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...
- [转]Oracle 存储过程语法
转自:http://www.cnblogs.com/chuncn/archive/2009/04/29/1381282.html 存储过程 1 CREATE OR REPLACE PROCEDURE ...
- buf.readInt8函数详解
offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的 offset 位置开始读取一个有符号的8位整数值. 设置 ...
- MacOS 升级后pod 出现的问题
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...
- 图像的全局特征--HOG特征、DPM特征
HOG特征:方向梯度直方图(Histogram of Oriented Gradient,)特征是一种全局图像特征描述子. 它通过计算和统计图像局部区域的梯度方向直方图来构成特征.Hog特征结合SVM ...
- 12 Python+selenium对日期控件进行处理(采用执行JS脚本)
[环境信息] Python34+IE+windows2008 [说明] 1.对于日期控件,没有办法通过定位元素再直接传值的方式处理.可以采用执行JavaScript处理. PS:还要去学学js怎么写, ...
- Swift Method Dispatching — a summary of my talk at Swift Warsaw
Swift Method Dispatching When announcing Swift, Apple described it as being much faster than Objecti ...