1.问题:

当我们看到java中的Collection,List,Set,Map等集合类时都可以用Iterator进行遍历元素时,我们是否感到很神奇。我们不禁要问java是如何实现这一目标的。这就是我今天要谈的话题。

根据Iterator pattern模式我把java中的集合类分为四类:即:

Iterator(抽象迭代器对应于java中的Iterator,其实java这个Iterator还有抽象聚合的功能,因为它实现了Iterable这个接口,而Iterable这个接口就是个抽象聚合类。), concreteIterator(对应与Collection,Map两个大类,及其这两个大类所对应的子类。)

Aggregate(抽象聚合,对应于java中的Iterable这个接口,其实质它是一个工厂类,生产Iterator的工厂)

ConcreterAggregate(具体聚合,实现Aggregate的类。这个类里面有聚集的对象,如何得到聚集元素,以及聚集对象的个数)

2.简要介绍一下:Iterator Patten

通过上面对java集合类的分类,我们可以很容易知道Iterator pattern 模式的角色有:Iterator    、concreteIterator、  Aggregate、   ConcreteAggregate、Client(相当于一个测试类。)

Iterator类的代码如下:

package com.qls.IteratorPattern2;

public interface Iterator {
void first();//第一个元素
void next();//下一个元素
boolean isDone();//是否到最后一个元素
Object currentItem();//返回当前元素
}

ConcreteIterator类的代码如下:

package com.qls.IteratorPattern2;

public class ConcreteIterator implements Iterator {
private int index;
private int size;
private ConcreteAggregate concreteAggregate;
public ConcreteIterator(ConcreteAggregate concreteAggregate) {
this.concreteAggregate=concreteAggregate;
size=concreteAggregate.size();
index=0;
}

@Override
public void first() {
// TODO Auto-generated method stub
index=0;
}

@Override
public void next() {
// TODO Auto-generated method stub
if(index<size){
index++;
}
}

@Override
public boolean isDone() {
// TODO Auto-generated method stub
return index>=size;
}

@Override
public Object currentItem() {
// TODO Auto-generated method stub
return concreteAggregate.getElement(index);
}

}

Aggregate的代码如下:

package com.qls.IteratorPattern2;

public interface Aggregate {
Iterator createIterator();
}

ConcreteAggregate的代码如下:

package com.qls.IteratorPattern2;

public class ConcreteAggregate implements Aggregate {
//聚集对象
private Object[] obj={"1","2","3","4","5","6"};

@Override
public Iterator createIterator() {
// TODO Auto-generated method stub
return new ConcreteIterator(this);//this代表:ConcreteAggregate
}
/**
* 返回聚集的大小。
* @return
*/
public int size(){
return obj.length;
}
/**
* 得到聚集元素
* @param index 聚集元素所对应的下标。
*/
public Object getElement(int index){
if(index<obj.length){
return obj[index];
}else{
return null;
}
}
}

Client的代码如下:

package com.qls.IteratorPattern2;

/**
* 把聚集元素打印出来。
* @author 秦林森
*
*/
public class Client {
private ConcreteAggregate concreteAggregate=new ConcreteAggregate();
private Iterator it;
public void operation(){
it = concreteAggregate.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Client().operation();
}

}

3.总结:

通过对Iterator pattern 的简单认识,可以消除我们对迭代器的神秘感,它的实现只不过是:在Aggregate类中有一个createIterator()方法,用以产生Iterator。把聚聚对象的

元素交给这个Iterator。上述例子中的聚集对象时一个Object[]的数组。

Iterator pattern 及其在java API中的运用的更多相关文章

  1. Java基础学习总结(67)——Java接口API中使用数组的缺陷

    如果你发现在一个接口使用有如下定义方法: public String[] getParameters(); 那么你应该认真反思.数组不仅仅老式,而且我们有合理的理由避免暴露它们.在这篇文章中,我将试图 ...

  2. RabbitMQ的Java API编程

    1.创建Maven工程,pom.xml引入依赖: <dependency> <groupId>com.rabbitmq</groupId> <artifact ...

  3. Java api 入门教程 之 JAVA的Random类

    在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...

  4. mybatis Java API

    既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyB ...

  5. 9. 使用ZooKeeper Java API编程

    ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...

  6. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  7. MyBatis——Java API

    Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDB ...

  8. kafka java API的使用

    Kafka包含四种核心的API: 1.Producer API支持应用将数据流发送到Kafka集群的主题 2.Consumer API支持应用从Kafka集群的主题中读取数据流 3.Streams A ...

  9. 迭代器模式在 Java 容器中的实现

    迭代器接口是迭代器模式实现的精髓: public interface Iterator<E> { boolean hasNext(); E next(); ... } 假设某容器名为 Xx ...

随机推荐

  1. (转)Unity 和 Cocos2d-x 越渐流行,国内公司开发「自研游戏引擎」的意义何在?

    分几个角度来说:一.我认为,Unity3D将无可挽回的,或者说,势在必得的,成为接下来很多年内,世界移动领域游戏引擎市场霸主.回顾历史,正如同咱们经历过一次又一次的互联网时代变革一样,x86,wind ...

  2. 天气预报api-汇总

    和风天气 https://www.heweather.com/

  3. 中通快递股份有限公司.net高级面试题

    中通快递分布式技术开发   gc垃圾回收原理 .net中,托管代码的内存管理是自动的,由GC进行管理,而对于非托管代码,则需要.net手动处理 CLR运行时,内存分为:托管堆和栈,其中栈用于存储值类型 ...

  4. 【Effective c++ 读书笔记】条款01 视 C++ 为一个语言联邦

    一开始,C++只是 C 加上一些面向对象的特性.C++最初的名称 C with Classes 也反映了这个血缘关系. 但是,现在,当这个语言逐渐成熟,它变得更活跃更无拘束,更大胆冒险,开始接受不同于 ...

  5. PHP 面向对象 static 和 self 的区别

    一.前言 php是世界上最好的语言 php从面向过程走到现在成熟的面向对象体系, 在php面向对象中,静态变量的调用我们可以用这两个self::method和 static::method, 但是很多 ...

  6. DSP资源分享贴

    DSP资源分享 [2017.5.16 更新] 分享资源共同学习.以前的资源很多人都说用不了了,我会陆续补充,逐步完善.这里不单单分享DSP的,设计基础的,还有其他的电子相关的比较好的资源吧主都和您分享 ...

  7. 多通道CNN

    在读Convolutional Neural Networks for Sentence Classification 这个文章的时候,它在论文中提出一种模型变种就是 CNN-multichannel ...

  8. Hadoop环境搭建 (伪分布式搭建)

    一,Hadoop版本下载 建议下载:Hadoop2.5.0 (虽然是老版本,但是在企业级别中运用非常稳定,新版本虽然添加了些小功能但是版本稳定性有带与考核) 1.下载地址: hadoop.apache ...

  9. DNS域名解析服务(bind)

    DNS(Domain Name System,域名系统): 用于管理和解析域名与IP地址对应关系的技术. 简单来说,就是能够接受用户输入的域名或IP地址,然后自动查找与之匹配(或者说具有映射关系)的I ...

  10. 9.4python开发之virtualenv与virtualenvwrapper

    在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...