23个java设计模式(八)-- 迭代器模式

2016年03月16日 原创
关键词: java 设计模式
摘要 迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

一、概述。

迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

合理组织数据的结构以及相关操作是程序设计的一个重要方面,比如在程序设计中经常会使用诸如链表、散列表等数据结构。链表和散列表等数据结构都是可以存放若干个对象的集合,其区别是按着不同的方式来存储对象。我们希望无论何种集合,应当允许程序以一种统一的方式遍历集合中的对象,而不需要知道这些对象在集合中是如何表示及存储的。

迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个称作迭代器的对象。

二、迭代器模式的结构。

迭代器模式的结构中包括四种角色:

  • 集合(Aggregate):一个接口,规定了具体集合需实现的操作。
  • 具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体集合按着一定结构存储对象。具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器。
  • 迭代器(Iterator):一个接口,规定了遍历具体集合的方法,比如next()方法。
  • 具体迭代器(ConcreteIterator):实现迭代器接口的类的实例。具体迭代器在实现迭代器接口所规定的遍历集合的方法时,比如next()方法,要保证next()方法的首次调用将按着集合的数据结构找到该集合中的一个对象,而且每当找到集合中的一个对象,立即根据该集合的存储结构得到待遍历的后继对象的引用,并保证依次调用next()方法可以遍历集合。

三、示例程序。

集合

使用java.util包中的Collection接口。

具体集合

使用java.util包中的HashSet。

迭代器

使用java.util包中的Iterator接口

具体迭代器

HashSet创建的集合可以使用iterator()方法返回一个实现Iterator接口类的实例,即一个具体迭代器。

测试代码

public class Example1Test {
	@Test
	public void testMain() {
		int n = 20;
		int sum = 0;
		Collection<RMB> set = new HashSet<RMB>();// 集合对象
		for (int i = 1; i <= n; i++) {
			if (i == n / 2 || i == n / 5 || i == n / 6)
				set.add(new RMB(100, false));
			else
				set.add(new RMB(100, true));
		}
		Iterator<RMB> iterator = set.iterator();// 迭代器
		int fake = 1, real = 1;
		System.out.println("保险箱共有" + set.size() + "张人民币");
		int k = 0;
		while (iterator.hasNext()) {
			RMB next = iterator.next();
			k++;
			if (!next.isReal()) {
				System.out.println("第" + k + "张是假币,应被销毁");
				iterator.remove();
				k++;
			} else {
				sum += next.getValue();
			}
		}
		System.out.println("保险箱现有真人民币"+set.size()+"张,总价值是:"+sum+"元");
	}

	class RMB {
		int value;
		private boolean isReal;

		public RMB(int value, boolean isReal) {
			this.value = value;
			this.isReal = isReal;
		}

		public int getValue() {
			return value;
		}

		public boolean isReal() {
			return isReal;
		}

	}
}

四、迭代器模式的优点。

  1. 用户使用迭代器访问集合中的对象,而不需要知道这些对象在集合中是如何表示及存储的。
  2. 用户可以同时使用多个迭代器遍历一个集合。

五、适合使用迭代器模式的场景。

  1. 让用户访问一个集合中的对象,但不想暴露对象在集合中的存储结构。
  2. 希望对象遍历不同的集合提供一个统一的接口。