设计模式16:迭代模式(Iterator)
迭代模式:
它提供了一种方法没有对象的顺序访问聚合对象的暴漏底层的细节。
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
事实上这个设计模式用的非常多,可是设计的非常少。由于stl中的迭代器就是这个模式的应用。预计这个设计模式的名字就是用从stl中的迭代器而来的。
UML图:
主要包含:
- Iterator:定义了一系列遍历訪问元素的接口
- ConcreteIterator:实现了Iterator定义的接口,并保存了一个详细的Aggregate中遍历的元素的位置。
- Aggregate:抽象的Aggregate。定义了一个返回Iterator对象的接口
- ConcreteAggregate:实现了返回Iterator的接口。
理解这个设计模式时能够和STL中的迭代器一起考虑,这样上面各个角色的作用就非常明了了。
这个设计模式用C++实现的关键是Operator[]的编写。我们相当于定义了一种简易的容器,准确的说是一种容器适配器。
C++代码:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Iterator;
class ConcreteIterator;
class Aggregate
{
};
//眼下还没有发现抽象的Aggregate的用途是什么。由于详细的迭代器须要知道ConcreteAggregate
//的内部实现细节。而在stl中是通过为每种easy定义一个内部迭代器类来保证的
class ConcreteAggregate:public Aggregate
{
public:
ConcreteAggregate()
{
datas=vector<string>(100);
}
friend class ConcreteIterator;
//这而事实上另一点问题。当datas元素超过100时会有问题。此时须要对内存又一次分配
string& operator[](const int &index)
{
return datas[index];
}
private:
vector<string> datas;
};
//抽象的迭代器类,提供了以下这个借口,在子类中能够详细实现这些接口的含义,比方stl中的正向
//和反向迭代器就是对接口的不同实现
class Iterator
{
public:
virtual string &first()=0;
virtual string next()=0;
virtual bool isDone()=0;
virtual string ¤tItem()=0;
};
class ConcreteIterator:public Iterator
{
public:
ConcreteIterator(ConcreteAggregate * agg)
{
aggregate=agg;
cur=0;
}
string& first()
{
return aggregate->datas[0];
}
string next()
{
if(cur+1<aggregate->datas.size())
{
cur+=1;
return aggregate->datas[cur];
}else
{
return NULL;
}
}
bool isDone()
{
int len=aggregate->datas.size();
if(cur==len-1)
return true;
else
return false;
}
string& currentItem()
{
return aggregate->datas[cur];
}
private:
ConcreteAggregate * aggregate;
int cur;
};
int main()
{
std::cout<<"迭代器模式測试"<<std::endl;
ConcreteAggregate agg ;
agg[0]="John";
agg[1]="Mike";
agg[2]="Bill";
agg[3]="Joe";
agg[4]="Kelly";
ConcreteIterator* iter=new ConcreteIterator(&agg);
std::cout<<iter->first()<<std::endl;
iter->next();
std::cout<<iter->currentItem()<<std::endl;
return 0;
}
运行输出:
版权声明:本文博主原创文章。博客,未经同意不得转载。
设计模式16:迭代模式(Iterator)的更多相关文章
- [设计模式] 16 迭代器模式 Iterator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...
- 【设计模式】—— 迭代模式Iterator
前言:[模式总览]——————————by xingoo 模式意图 提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示. 应用场景 1 访问一个聚合的对象,而不需要暴露对象的内部表 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- 19迭代模式Iterator
一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之 一,它把对容器中包含的内部对象的访问委让给 外部类,使用Iterator(遍历)按顺序进行遍历 访问的设计模式. 二.不使用迭代模式 ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- GoLang设计模式16 - 模板方法模式
模板方法设计模式是一种行为型设计模式.这种模式通过常用于为某种特定的操作定义一个模板或者算法模型. 以一次性密码(OTP:One Time Password)为例.我们常见的一次性密码有两种:短信密码 ...
- C#设计模式(16)——迭代器模式(Iterator Pattern)
一.引言 在上篇博文中分享了我对命令模式的理解,命令模式主要是把行为进行抽象成命令,使得请求者的行为和接受者的行为形成低耦合.在一章中,将介绍一下迭代器模式.下面废话不多说了,直接进入本博文的主题. ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
随机推荐
- IT痴汉的工作现状13-吓唬电话
那是一个普通的周末上午,稍微阴沉的天,使得暑气消退了好多.刚吃过早饭,我懒懒的浏览着CSDN论坛上有趣的问题和答案. 突然电话响起.是一个陌生的号码.我像往常一样接起电话,""您好 ...
- Unity3D在一建筑GL材料可以改变颜色和显示样本
void CreateLineMaterial() { if (!mat) { mat = new Material("Sha ...
- java.lang.RuntimeException: Method called after release()
主要引起是因為在 camera.stopPreview(); camera.release(); 前沒有將setPreviewCallback 設置為null, 解決情況: public void ...
- JQuery打印
jquery.jqprint-0.3.js JQuery提供的局部打印功能: <input type="button" value="打印" onclic ...
- SQL注入的原理解说,挺好!
原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 总结 前几天,国内最大的程序猿社区CSDN网站的用户数据库 ...
- 配置Tomcat的日志系统
成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...
- js控制图片缩放、水平和垂直方向居中对齐
已測试兼容 IE6,IE7,IE8,火狐FF,谷歌chrome. 这里使用了jquery插件,假设你不使用jquery,略微改造一下也非常快. 网上查了些资料,用css控制兼容性不好,看去非常揪心.于 ...
- F5当刷新页面,出现“要再次显示此页,web该浏览器,你曾经有过发送消息再次提交...点击重试",如何防止此对话框解决方案的出现,
如何取消刷新页面弹出"重试"对话? 找了好多类似的问题都没有我想要的答案,请大家看清楚再回答. 比方说,登录过程中,成功之后转向还有一个页面success.jsp, 这时,假设刷新 ...
- 使用crontab创建 linux 系统定时任务#
任务1: 每隔1分钟,运行一次 /home/sn/yeelink.sh文件 ,用于上传数据到www.yeelink.net 1. 先在当时目录里面创建一个cronfile文件 vim cronfile ...
- 《SAS编程和数据挖掘商业案例》学习笔记# 19
继续<SAS编程与数据挖掘商业案例>学习笔记,本文側重数据处理实践.包含:HASH对象.自己定义format.以及功能强大的正則表達式 一:HASH对象 Hash对象又称散列表,是依据关键 ...