JAVA设计模式之 迭代器模式【Iterator Pattern】

一、概述

提供一种方法来访问聚合对象(容器container),而不用暴露这个对象的内部细节。

二、适用场景

1>遍历访问聚合对象中的元素,而无须暴露它的内容表示,将聚合对象的访问和内部数据的存储分离。使得访问聚合对象时无须了解其内部的实现细节。

2>需要为一个聚合对象提供多种遍历实现。

三、UML类图

四、参与者

1>Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:用于获取第一个元素的first()方法,用于访问下一个元素的next()方法,用于判断是否还有下一个元素的hasNext()方法,用于获取当前元素的currentItem()方法等,在具体迭代器中将实现这些方法。

2>ConcreteIterator(具体迭代器):它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。

3>Aggregate(抽象聚合类):它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。

4>ConcreteAggregate(具体聚合类):它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。

五、用例学习

1、抽象迭代器 Iterator.java

/**
 * 自定义迭代器接口<br/>
 * <b>说明:</b>
 * 此处没有使用JDK内置的迭代器接口 java.util.Iterator<E>
 * @author  [email protected]
 *
 */
public interface Iterator {
    /** 将游标指向第一个元素  */
	public Object first();
	/** 将游标指向下一个元素  */
	public Object next();
	/** 判断是否存在下一个元素  */
	public boolean hasNext();
	/** 返回游标指向的当前元素  */
	public Object currentItem();
}

2、具体迭代器 ConcreteIterator.java

/**
 * 具体迭代器实现类<br/>
 * 访问聚合对象、对聚合对象内部元素遍历
 * @author  [email protected]
 *
 */
public class ConcreteIterator implements Iterator {
	// 维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据
	private Aggregate aggregate;
	// 定义一个游标,用于记录当前访问位置
	private int cursorIndex; 

	public ConcreteIterator(Aggregate aggregate){
		this.aggregate = aggregate;
	}

	@Override
	public Object first() {
		cursorIndex = 0;
        return aggregate.getObjects().get(cursorIndex);
	}

	@Override
	public Object next() {
		cursorIndex++ ;
		if(hasNext()){
			return aggregate.getObjects().get(cursorIndex);
		}
		return aggregate.getObjects().get(0);
	}

	@Override
	public boolean hasNext() {
		if (cursorIndex < aggregate.getObjects().size()) {
			return true;
		}
		return false;
	}

	@Override
	public Object currentItem() {
		return aggregate.getObjects().get(cursorIndex);
	}

}

3、抽象聚合类 Aggregate.java

import java.util.ArrayList;
import java.util.List;

/**
 * 抽象聚合对象
 * @author  [email protected]
 *
 */
public abstract class Aggregate {

	/** 创建迭代器  具体创建什么样迭代方式的迭代器由具体的子类去实现 */
	public abstract Iterator createIterator();

    protected List<Object> objects = new ArrayList<Object>();  

	public Aggregate(List objects) {
        this.objects = objects;
    } 

	public void addObject(Object obj){
		objects.add(obj);
	}

	public void deleteObject(Object obj){
		objects.remove(obj);
	}

	public List<Object> getObjects(){
		return objects;
	}

}

4、具体聚合类 ConcreteAggregate.java

import java.util.List;

/**
 * 具体聚合对象
 * @author  [email protected]
 *
 */
public class ConcreteAggregate extends Aggregate {

	public ConcreteAggregate(List objects) {
		super(objects);
	}

	/**
	 * 提供工厂方法 创建具体的迭代器实例<br/>
	 * 由迭代器去执行具体的聚合对象的遍历访问<br/>
	 * 这样就将聚合对象的数据存储 和 对聚合对象元素的访问进行了分离
	 */
	@Override
	public Iterator createIterator() {
		return new ConcreteIterator(this);
	}

}

5、客户端测试类 Client.java

import java.util.ArrayList;
import java.util.List;

public class Client {

	public static void main(String[] args){
		List<String> nameList = new ArrayList<String>();
		nameList.add("Java");
		nameList.add("C");
		nameList.add("C++");

		// 实例化具体聚合对象 且 创建初始化集合数据
		ConcreteAggregate languageAggregate = new ConcreteAggregate(nameList);
		// 获取聚合对象关联的迭代器
		Iterator iterator = languageAggregate.createIterator();

		// 通过迭代器访问聚合对象的内部数据
		String firstLanguage = (String) iterator.first();  // 访问聚合对象集合中索引为1的元素
		System.out.println(firstLanguage);

		boolean hasNext = iterator.hasNext();
		System.out.println("是否还有下一个元素:" + hasNext);

		if(hasNext){
			String nextLanguage = (String) iterator.next();
			System.out.println("下一个元素:" + nextLanguage);
		}
	}

}

6、运行效果

Java
是否还有下一个元素:true
下一个元素:C

六、其他/扩展

Java JDK内置的迭代器:

说到迭代器模式 给我们的第一联想就是Java中 我们使用最最频繁的java.util.Iterator接口啦。

没错 他就是JDK中内置的迭代器。public interfaceIterator<E> 对collection进行迭代的迭代器。

这里想扩展的一个点是:关于接口Iterator的子接口ListIterator<E>的介绍

这个ListIterator子接口 也许我们平时的代码中使用的少,那么他有什么功能呢?

下面先看两张截图<比较比较 答案就在其中>

Iterator API方法:

ListIterator API方法:

从上面两个截图分析中我们可以看出Iterator只能进行单向遍历,而ListIterator可以进行双向遍历(向前/向后),且可以在迭代期间修改列表。最后附上一张截图如下:

时间: 2024-07-30 10:11:06

JAVA设计模式之 迭代器模式【Iterator Pattern】的相关文章

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

迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现在要提供一种方法顺序地访问这个聚合对象中的各个元素. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Iterator { /// <summary>

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

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 迭代器模式(iterator pattern) 详解

迭代器模式(iterator pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包含hasNext()方法和next()方法; 不同聚合对象的具体的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator in

设计模式 - 迭代器模式(iterator pattern) 扩展 详解

迭代器模式(iterator pattern) 扩展 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式-Java迭代器: http://blog.csdn.net/caroline_wendy/article/details/35268931 扩展迭代器模式, 添加一个Hashtable存储的类. 具体方法: 1. Hashtable的类, 包含创建value()的迭代器(iterator). /** * @time 2014年6月27日

设计模式 - 迭代器模式(iterator pattern) 具体解释

迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序訪问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包括hasNext()方法和next()方法; 不同聚合对象的详细的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator

设计模式(行为型)之迭代器模式(Iterator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之观察者模式(Observer Pattern)>http://blog.csdn.net/yanbober/article/details/45484749 概述 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构

[设计模式] 迭代器模式 Iterator Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角色组成: 1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口.2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置.3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口.4.具体集合角色(Concre

折腾Java设计模式之迭代器模式

迭代器模式 Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种不公示其底层细节(结构)的情况下能顺序访问聚合对象元素的方法. 其实在java体系中,jdk已经引入了迭代器接口以及对于的容器接口等.就拿迭代器中的角色,在java中找出其对应的类. 具体角色 (1)迭代器角色(Iterator):定义遍

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,