Iterator pattern 及其在java API中的运用

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[]的数组。

时间: 2024-11-04 06:26:48

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

Java基础----Java API中的常用类

System:描述系统的一些信息 preperties();获取系统信息 Properties prop =new System.getProperties(); 是hashtable 的子类.用map的方法去除该类集合中的元素.该集合中存储的都是字符串,没有泛型定义. String calue=(String)prop.get(obj); System.out.println(obj+":"+value); //如何在系统中自定义一些特有信息? System.setProperty(

java API中提供的HashMap的常用方法

根据java1.6 的API整理一下HashMap的几个常用方法. 1.size public int size(); 返回此映射中的键-值映射关系数 2.isEmpty public boolean isEmpty() 判断此map是否不包含键-值映射关系 3.get public V get(Object key) 返回指定键所映射的值:如果对于该键来说,此映射不包含任何映射关系,则返回 null.返回 null 值并不一定表明该映射不包含该键的映射关系:也可能该映射将该键显示地映射为 nu

java API中提供的ArrayList的常用方法

根据java1.6 的API整理一下Arraylist的几个常用方法. 三个构造函数 1.public ArrayList(int initialCapacity); 构造一个具有指定初始容量的空列表 2.pubilc ArrayList(); 构造一个初始容量为10的空列表 3.public ArrayList(Collection<> c) 构造一个包含指定collection的元素的列表. 若collection为null,会抛出NullPointerException 其他常用方法 4

通过查询java API中的String类完成任务

package com.String;public class A {     public static void main(String[] args) {         String str = "this is a test of java";         t1(str);// static方法可直接调用         t2(str);         t3(str);         t4(str);         t5(str);         t6(str);

MyBatis——Java API

Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyBatis 很大程度简化了你的代码而且保持简洁,很容易理解和维护.MyBatis 3 已经引入 了很多重要的改进来使得 SQL 映射更加优秀. 应用目录结构 在我们深入 Java API 之前,理解关于目录结构的最佳实践是很重要的.MyBatis 非常灵 活, 你可以用你自己的文件来

避免在Java+接口中使用数组的3个理由

转帖: http://eclipsesource.com/blogs/2014/04/11/3-good-reasons-to-avoid-arrays-in-java-interfaces/ 如果你发现在一个接口使用有如下定义方法: public String[] getParameters(); 那么你应该认真反思.数组不仅仅老式,而且我们有合理的理由避免暴露它们.在这篇文章中,我将试图总结在Java API中使用数组的缺陷.首先从最出人意料的一个例子开始. 数组导致性能不佳 你可能认为使用

JAVA基础篇三(Java,C++中的异常机制)

由于C++和JAVA有很多相似之处,又有很多细微的差别,所以在学习JAVA的过程中对两种语言进行对比学习. 1.C++的异常机制 C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理.如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,由它调用abort终止程序.这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理.这使得底层

mybatis Java API

既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyBatis 很大程度简化了你的代码而且保持简洁,很容易理解和维护.MyBatis 3 已经引入 了很多重要的改进来使得 SQL 映射更加优秀. 应用目录结构 在我们深入 Java API 之前,理解关于目录结构的最佳实践是很重要的.MyBatis 非常灵 活, 你可以用你自己的文件来做几乎所有的事情.

Java 8 中的 Streams API 详解

为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (