`

读《研磨设计模式》-代码笔记-迭代器模式-Iterator

阅读更多
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/



import java.util.Arrays;
import java.util.List;

/**
 * Iterator模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象内部表示
 * 
 * 个人觉得,为了不暴露该对象内部表示,而额外地提供一组访问接口(通用的遍历接口)
 * 具体来说,就是想办法在被遍历的对象里面提供一个获得Iterator的方法: Iterator iterator(){...}
 * 然后利用这个Iterator去遍历
 * Iterator里面实现了通用的遍历方法:first(),next(),isDone(),currItem()
 * 
 * 书上还提到一个很实用的例子,就是迭代器实现翻页
 */
interface Iterator {
	void first();

	void next();

	boolean isDone();

	Object currItem();
}


abstract class Aggregate {
	public abstract Iterator iterator();
}

//需要用迭代器遍历的对象
class ArrayAggregate extends Aggregate {

	private String[] data;

	public ArrayAggregate(String[] data) {
		this.data = data;
	}

	@Override
	public Iterator iterator() {
		return new ArrayIterator(this);
	}

	public Object get(int index) {
		Object item = null;
		if (index < data.length) {
			item = data[index];
		}
		return item;
	}

	public int size() {
		return data.length;
	}
}

//需要用迭代器遍历的对象
class ListAggregate extends Aggregate {

	private List<String> data;

	public ListAggregate(List<String> data) {
		this.data = data;
	}

	@Override
	public Iterator iterator() {
		return new ListIterator(this);
	}

	public int size() {
		return data.size();
	}

	public Object get(int index) {
		Object item = null;
		if (index < data.size()) {
			item = data.get(index);
		}
		return item;
	}
}


class ArrayIterator implements Iterator {

	private int index;

	/* 如果是带迭代策略的Iterator,那ArrayIterator持有的就不是整个ArrayAggregate,
	 * 而是
	 1.ArrayAggregate过滤后的部分数据(例如只允许访问第一条记录),
	 		可在构造函数里过滤:
			private String[] dataAfterFilter;
		 	public ArrayIterator(ArrayAggregate aggregate) {
		 		dataAfterFilter =new String[]{(String) aggregate.get(0)};
			}
	 2.从数据库取指定数量的指定记录(翻页)
	 3.等等
	 */
 	
	private ArrayAggregate aggregate;

	public ArrayIterator(ArrayAggregate aggregate) {
		this.aggregate = aggregate;
	}

	//first(),next(),isDone(),currItem()这些方法,最终还是调用被遍历的对象的方法来实现
	public void first() {
		index = 0;
	}

	public void next() {
		if (index < aggregate.size()) {
			index++;
		}
	}

	public boolean isDone() {
		return index == aggregate.size();
	}

	public Object currItem() {
		return aggregate.get(index);
	}
}


class ListIterator implements Iterator {

	private ListAggregate aggregate;

	private int index;

	public ListIterator(ListAggregate aggregate) {
		this.aggregate = aggregate;
	}

	public void first() {
		index = 0;
	}

	public void next() {
		if (index < aggregate.size()) {
			index++;
		}
	}

	public boolean isDone() {
		return index == aggregate.size();
	}

	public Object currItem() {
		return aggregate.get(index);
	}

}


public class IteratorPattern {

	public static void main(String[] args) {

		String[] array = { "aa", "bb", "cc" };
		ArrayAggregate aggregate2 = new ArrayAggregate(array);
		Iterator iterator2 = aggregate2.iterator();
		visit(iterator2);

		List<String> list = Arrays.asList(array); // asList返回的是一个不可修改的List,只供遍历
		ListAggregate aggregate = new ListAggregate(list);
		Iterator iterator = aggregate.iterator();
		visit(iterator);

	}

	public static void visit(Iterator iterator) {
		iterator.first();
		while (!iterator.isDone()) {
			Object obj = iterator.currItem();
			System.out.println(obj);
			iterator.next();
		}
	}
}

分享到:
评论

相关推荐

    设计模式专题之(二十三)迭代器模式---设计模式迭代器模式示例代码(python--c++)

    迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。在本文中,我们将深入探讨迭代器模式的概念,并通过Python和C++两种编程语言展示其实现。 首先,理解迭代器模式...

    研磨设计模式-part2

    第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式...

    研磨设计模式-part4

    第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式...

    研磨设计模式-part3

    第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式...

    设计模式(C#)之迭代器模式(Iterator Pattern)

    迭代器模式是软件设计模式中的一种行为模式,它在C#等面向对象编程语言中有着广泛的应用。这个模式的主要目标是允许用户遍历一个聚合对象(如数组、集合或列表)的所有元素,而无需了解底层的实现细节。下面将详细...

    iterator-demo 迭代器设计模式demo

    这个“iterator-demo”应该是一个示例项目,用于演示如何在实际编程中应用迭代器模式。下面我们将深入探讨迭代器模式及其在IT领域的应用。 迭代器模式的核心思想是为集合类提供一种统一的访问方式,使得客户代码...

    设计模式--迭代器模式java例子

    迭代器模式是一种行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java中,迭代器模式广泛应用于集合框架,如ArrayList、LinkedList等。本示例将深入探讨如何在Java中实现和使用迭代器...

    设计模式-迭代器模式(讲解及其实现代码)

    迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这种模式允许我们遍历集合中的每个元素,同时保持集合本身抽象,不需了解其内部结构。 在Java、C#等面向对象语言...

    (行为型模式) Iterator 迭代器模式

    C#面向对象设计模式 (行为型模式) Iterator 迭代器模式 视频讲座下载

    【Java设计模式】(1)迭代器模式Iterator

    迭代器模式(Iterator Pattern)是Java设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等,通过...

    23个设计模式之一的迭代器模式-极客学院-java-课件代码,

    迭代器模式是软件设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java编程语言中,迭代器模式的应用尤为广泛,尤其是在处理集合类如ArrayList、LinkedList等时。这...

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

    迭代器模式是软件设计模式中的一种行为模式,它在编程中扮演着重要的角色,尤其是在处理集合数据时。迭代器模式的核心思想是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这种模式使得用户可以在不...

    c#代码介绍23种设计模式-16迭代器模式(附代码)

    迭代器模式提供了一种方法顺序访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。 3. 迭代器模式的...

    C++设计模式课件21_Iterator_迭代器.pdf

    本文将基于“C++设计模式课件21_Iterator_迭代器.pdf”的内容,详细介绍迭代器模式的基本概念、实现方式以及应用场景,并结合C++语言特性进行深入探讨。 #### 二、迭代器模式定义 迭代器模式(Iterator Pattern)...

    Android设计模式之--迭代器模式

    迭代器模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理集合对象的遍历操作时。这种模式提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java或Android编程中,...

    java设计模式--迭代器设计模式.docx

    迭代器模式是软件设计模式中的一种行为模式,其主要目的是为了在不暴露聚合对象内部结构的情况下,提供一种顺序访问聚合对象中各个元素的方式。在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等...

    java常用设计模式-迭代器模式

    Java 迭代器模式 Java 迭代器模式是一种行为设计模式,它提供了一种访问集合对象元素的方法,而不需要...迭代器模式是一种非常有用的设计模式,它可以帮助开发者更方便地遍历集合对象,并提高代码的可维护性和可读性。

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。 - 备忘录模式(Memento):在不破坏封装性的前提下...

    设计模式-实例代码

    总结来说,这个“设计模式-实例代码”的资源很可能提供了关于迭代器模式以及其他设计模式的实现,这对于学习和应用设计模式的开发者来说是一份宝贵的参考资料。通过研究这些代码,我们可以加深对设计模式的理解,...

Global site tag (gtag.js) - Google Analytics