顺序访问聚集中的对象,主要用于集合中。一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。 迭代子模式为遍历集合提供了统一的接口方法。从而使得客户端不需要知道聚集的内部结构就能就能对聚集进行遍历等操作。Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。

例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) {
... get(i) ... }
而访问一个链表(LinkedList)又必须使用while循环:

while((e=e.next())!=null) { ... e.data() ... }

以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。

更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。

为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater();
it.hasNext(); ) { ... }

奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。

客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。

好的,迭代子模式主要有5个对象

抽象迭代子角色:定义了遍历聚集的接口。

具体迭代子角色:实现了抽象迭代子接口。

抽象聚集角色:定义聚集的公共方法,并为聚集创建迭代子(Iterator)对象。

具体聚集角色:能够返回一个实现迭代子(Iterator)接口的迭代子实例。

客户端角色:持有对聚集和迭代子实例的引用,通过迭代子对聚集进行迭代。

抽象迭代子角色:

package iterator;

public interface Iterator {
public Object First();
public Object previous();
public Object Next();
public boolean hasNext(); }

抽象聚集角色:

package iterator;

public abstract class Collection {
public abstract Iterator iterator();
public abstract int size();
public abstract Object getElement(int index);
}

具体聚集角色:

package iterator;

public class ChildCollection extends Collection{
//创建一个字符串数组
public String items[] = {"A","B","C","D","E"}; /*集合初始化,获取集合实例*/
@Override
public Iterator iterator() {
return new IteratorImplement(this);
} /*获取数组的长度*/
@Override
public int size() {
return items.length;
} /*获取数组元素的位置*/
@Override
public Object getElement(int index) {
return items[index];
} }

具体迭代子角色:

package iterator;

public class ChildCollection extends Collection{
//创建一个字符串数组
public String items[] = {"A","B","C","D","E"}; /*集合初始化,获取集合实例*/
@Override
public Iterator iterator() {
return new IteratorImplement(this);
} /*获取数组的长度*/
@Override
public int size() {
return items.length;
} /*获取数组元素的位置*/
@Override
public Object getElement(int index) {
return items[index];
} }

客户端角色:

package iterator;

public class Client {
public static void main(String[] args) {
/*创建实例*/
Collection collection=new ChildCollection();
/*获取集合迭代对象*/
Iterator iterator=collection.iterator();
while(iterator.hasNext()){
System.out.println(iterator.Next());
}
} }

 结果:

A
B
C
D
E

可以看看jdk源码,我们实现了jdk中Iterator的功能。有点区别就是Collection也实现了Iterator接口,在Collection子类里面可以根据不同的类(比如数组、ArrayList、LinkedList)在各个类实现Iterator接口,仅仅是内部实现的方式不一样,实现方法是一样的。

java设计模式----迭代子模式的更多相关文章

  1. Java设计模式-迭代子模式(Iterator)

    顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松.这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对 ...

  2. [工作中的设计模式]迭代子模式Iterator

    一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...

  3. JAVA设计模式之迭代子模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...

  4. 设计模式《JAVA与模式》之迭代子模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...

  5. java设计模式8.迭代子模式、责任链模式、命令模式

    迭代子模式 迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象.它将迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分开.迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代 ...

  6. Java设计模式(18)——行为模式之迭代子模式(Iterator)

    一.概述 概念 UML简图 // Aggregate:聚集(集合) 角色 抽象迭代子:定义遍历元素所需要的接口 具体迭代子:实现抽象迭代子接口,保持游标 聚集/具体聚集:定义/实现创建迭代子对象的接口 ...

  7. [设计模式]迭代子模式 Iterator

    迭代子模式又叫做游标cursor模式,是对象的行为模式.迭代子模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象. 迭代子模式被广泛的应用在Java语言的API中的几个设计模式之一.在Java ...

  8. Java设计模式(12)迭代模式(Iterator模式)

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...

  9. 《JAVA与模式》之迭代子模式

    迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation). 聚集和JAVA聚集 多个 ...

随机推荐

  1. ubuntu 16.04 安装pycharm

    Ubuntu16.04下安装Cuda8.0+Caffe+TensorFlow-gpu+Pycharm过程(Simple) ubuntu 16.04 安装pycharm 1.安装java  jdk 直接 ...

  2. 【转】WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  3. qt 窗口控件自动调整大小

    /******************************************************************** * qt 窗口控件自动调整大小 * * 在写gui的时候,希 ...

  4. XML 入门

    XML语法 所有 XML 元素都须有关闭标签 XML 标签对大小写敏感 XML 必须正确地嵌套 XML 文档必须有根元素 就像HTML一样,HTML必须有<html>根元素.XML也必须有 ...

  5. C# HttpClientHelper请求

    public class HttpClientHelper { /// <summary> /// get请求 /// </summary> /// <param nam ...

  6. CSAPP chapter2 记录(bit_level_coding)

    p_154 //5x/8 define MSB_BIT (~(~)) int mul5div8(int val) { int sign = (val & MSB_BIT) == MSB_BIT ...

  7. apache基金会开源项目简介

    apache基金会开源项目简介   项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache  Abdera项目的目标是建立一个功能完备,高效能的IETF ...

  8. 转:windows 下 netsh 实现 端口映射(端口转发)

    本文转自:本文出自 “httpyuntianjxxll.spac..” 博客,请务必保留此出处http://333234.blog.51cto.com/323234/1135361 -----hapr ...

  9. liunx下误删除/var目录下的empty文件,导致ssh连接不上

    清理Liunx上不用的文件,导致误删 /var/下的empty文件,因为用的是ftp删的,所以可能有隐藏文件没有看到,导致其他同事都登录不上去 解决方法: 1.在/var文件夹下,重新建立empty文 ...

  10. JQuery------jQuery.parseHTML()的使用方法

    代码: $(document).ready(function () { var data = jQuery.parseHTML("<p>你好</p>"); ...