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 ...
随机推荐
- Vue跨域访问,axios&cors
先安装node.js和npm,这个不用说了,直接在创建vue项目,然后实践一下跨域访问. 如果npm安装较慢,可安装淘宝镜像,执行下面命令: npm install -g cnpm --registr ...
- Asp.net MVC4 Step by Step (2)-参数数据的传递
首先创建一个表单,不同于WebForm,框架提供了一系列HMTL帮助方法来生成HTML标签. 下面创建一个Create.cshtml为文件名的视图. <h2> Create Auction ...
- PANDAS 数据分析初学者教程
Pandas 初学者教程 2018-05-19 六尺巷人 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非常重要的Python包.它不仅提供了很多方法,使得数据处理非常 ...
- Android高亮TextView
HighlightTextView Android文本高亮控件,基于View实现. 特点 文本高亮 单词自动换行 高亮词组保持在同一行显示 截图 Demo Java: public class Mai ...
- MacOS 升级后pod 出现的问题
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...
- excel 处理方法
//.方法一:采用OleDB读取EXCEL文件: //打开excel 返回指定表中的所有数据 public DataSet ExcelToDS(string Path) { string strCon ...
- Coreldraw软件反盗版提示x8有优惠活动 cdr x8提示盗版怎么办?
CorelDRAW X8装不上,我的悲伤有这么大,或者比这还大一点...♥♥♥如果你遇到这样的断了网,卸了装,装了卸,然后再安装的...╮(-_-)╭这样的保存和另存为都点不了,不敢关电脑的亦或是这样 ...
- X509 颁发者和使用者 详解
CN=公用名称C=国家ST=省份L =城市或者区域O=组织名称OU=组织单位名称
- redis客户端连接到服务器的步骤
和大多数客户端连接到服务器一样,redis-cli连接到服务器也主要分为两个阶段,请求连接阶段和数据传送阶段.具体来讲redis-cli做的事情有: 1.以socket方式建立连接: 2,选择相应的数 ...
- BZOJ 1060: [ZJOI2007]时态同步 树上问题 + 贪心
Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路 ...