当前位置:首页 > 开发 > 编程语言 > 设计模式 > 正文

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

发表于: 2012-09-26   作者:bylijinnan   来源:转载   浏览:
摘要: 声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.Arrays; import java.util.List; /** * 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();
		}
	}
}

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
14.2 解决方案 14.2.1 迭代器模式来解决 用来解决上述问题的一个合理的解决方案就是迭代器模式。那
   GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示。 为遍历不
本文出自 http://blog.csdn.net/shuangde800 走进迭代器模式 迭代器几乎是最常用的一种设计模式,在
本文出自 http://blog.csdn.net/shuangde800 走进迭代器模式 迭代器几乎是最常用的一种设计模式,在
迭代器模式 类似于for循环式的代码段在日常开发过程中是很经常用到的,所有有了Iterator模式。既然
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示 迭代器模式能
定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部细节。 类型:对象行为
官方描述 提供一种方法顺序访问一个聚合对象中的各元素,而又无需暴露该聚合对象的内部表示。 我的
迭代器模式:提供一种方法顺序访问一个聚合中的各个元素,而又不暴露其内部表示。 要点: 1.迭代器允
C# 中已经实现了迭代器功能, foreach in 和 IEnumerable 和 IEumerator 接口 是为迭代器而准备的。
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号