迭代模式:

它提供了一种方法没有对象的顺序访问聚合对象的暴漏底层的细节。

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

事实上这个设计模式用的非常多,可是设计的非常少。由于stl中的迭代器就是这个模式的应用。预计这个设计模式的名字就是用从stl中的迭代器而来的。

UML图:

主要包含:

  1. Iterator:定义了一系列遍历訪问元素的接口
  2. ConcreteIterator:实现了Iterator定义的接口,并保存了一个详细的Aggregate中遍历的元素的位置。
  3. Aggregate:抽象的Aggregate。定义了一个返回Iterator对象的接口
  4. 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 &currentItem()=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)的更多相关文章

  1. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

  2. 【设计模式】—— 迭代模式Iterator

    前言:[模式总览]——————————by xingoo 模式意图 提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示. 应用场景 1 访问一个聚合的对象,而不需要暴露对象的内部表 ...

  3. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  4. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  5. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  6. 19迭代模式Iterator

    一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之 一,它把对容器中包含的内部对象的访问委让给 外部类,使用Iterator(遍历)按顺序进行遍历 访问的设计模式. 二.不使用迭代模式 ...

  7. 二十四种设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...

  8. GoLang设计模式16 - 模板方法模式

    模板方法设计模式是一种行为型设计模式.这种模式通过常用于为某种特定的操作定义一个模板或者算法模型. 以一次性密码(OTP:One Time Password)为例.我们常见的一次性密码有两种:短信密码 ...

  9. C#设计模式(16)——迭代器模式(Iterator Pattern)

    一.引言 在上篇博文中分享了我对命令模式的理解,命令模式主要是把行为进行抽象成命令,使得请求者的行为和接受者的行为形成低耦合.在一章中,将介绍一下迭代器模式.下面废话不多说了,直接进入本博文的主题. ...

  10. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

随机推荐

  1. QTP小应用一则

    昨天收到一个任务,将270多个视频文件按照统一的编码要求,转换为其他格式,而且给的转换器居然不能批量转换! 在痛苦地转换了30多个之后,我才想起来使用QTP的数据驱动测试方法可以解决这个问题! 于是我 ...

  2. 重写ResultSet实现分页功能(最好的分页技术)(转)

    1.首先定义一个接口Pageable 继承ResultSet这个类 并在接口中定义一些自己的方法,具体方法如下: package com.page; import java.sql.ResultSet ...

  3. J2SE基础:1.类和对象基础

    什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...

  4. SQL Server :理解Page Free Space (PFS) 页

    原文:SQL Server :理解Page Free Space (PFS) 页 我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free S ...

  5. android定位方式

    做移动互联网就不太可能不碰手机端的开发.上周为了项目需要,俺也挽袖子抡胳膊开始写起了android程序,还好有java基础,倒也上手快,写了几个小程序,主要都是关于定位方面的. 网上也搜得到一些相关的 ...

  6. TCP/IP详细说明--滑模、拥塞窗口、慢启动、Negle算法

    TCP的数据流大致能够分为两类,交互数据流与成块的数据流. 交互数据流就是发送控制命令的数据流.比方relogin,telnet.ftp命令等等.成块数据流是用来发送数据的包,网络上大部分的TCP包都 ...

  7. 分析java.lang.NullPointerException thrown in RelativeLayout measure()

    典型的再现环境 模型: Sony Ericsson Android version: 2.3.4 StackTrace: E/AndroidRuntime( 3579): FATAL EXCEPTIO ...

  8. VMware装ubuntu 进不去图形界面, 卡在Installing VMware Tools

    1.按Ctrl +C结束,进入命令行 2.ubuntu login:_ 依次输入: 1)你的用户名:输入自己的! 2)你的密码:输入自己的! 3)获取root权限:sudo su 输密码 4)/etc ...

  9. Android MVC MVP

    从.NET的宠物商店到Android MVC MVP   1 一些闲话 记得刚进公司的时候,我们除了做常规的Training Project外,每天还要上课,接受各种技术培训和公司业务介绍.当时第一次 ...

  10. org.apache.subversion.javahl.ClientException: svn: E155021: This client is too old to work with the

    org.apache.subversion.javahl.ClientException: svn: E155021: This client is too old to work with the ...