迭代器模式
迭代器模式,定义为,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示方法。
迭代器模式,允许访问聚合中的各个元素,为客户提供了统一的方法去访问各个集合,屏蔽了具体集合的类型,无论是List,Map,Set,散列表,数组等集合,在客户端表现的都是一种方法来获取该集合中的元素。
通常迭代器将遍历聚合的工作封装进一个对象中,在我们使用迭代器的时候,我们依赖聚合提供遍历,通常聚合都会返回一个迭代器。这样就可以让集合只专注于元素的操作,而将对于元素游走的遍历工作放在迭代器上执行,这样就可以简化聚合的接口和实现。如果你有一个统一的方法来访问聚合中的每一个对象,则就可以利用多态的代码和这些聚合搭配。
迭代器类图如下:
Aggregate:主要是一种接口,提供了一个方法来给客户端,客户端可以利用该方法来返回一个对于聚合元素访问遍历的迭代器,而不用关心聚合是数组,列表等集合类型
ConcreteAggregate:是实现了该接口,这个是具体聚合持有了一个对象的集合,每一个具体聚合都要负责实例化与之丢应的具体迭代器,此迭代器能够遍历对象集合。
Iterator:这是所有迭代器都要实现的接口,一般可以直接实现Java系统自带的Iterator。
ConcreteIterator:对于特定聚合对象进行遍历的算法。它主要负责遍历对象,以及判断对象。
注:在常用的各种集合对象中,list,Set均可以直接调用它们的方法List.iterator();和Set.iterator();
一般对于如果是数组类型的,则就需要专门为数组做一个迭代器来转换它的遍历方式
对于Map集合的,由于Map集合是键值对的,所以要想取得它的值,
Map.values.iterator();//首先返回值的对象所有集合,然后再生成迭代器
一般迭代器是向前移动的,但是也可以实现向后移动,有一个ListIterator,这个可以实现向后移动元素的访问。迭代器遍历的结果并不是表示元素的大小次序的。在利用迭代器中,当一个方法的参数是一个迭代器的时候,其实就是使用了多态,我们此时针对接口编程而不是具体类编程,从而可以在不同的集合中遍历。
当然如果不想创建迭代器,可以直接利用foreach
代码示例:
有三个聚合类,一个用ArrayList存储对象,一个用数组存储对象,一个利用HashMap。由于三个集合访问遍历集合中的元素不同,但是为了给客户端提供一个统一的访问方法,此时就可以利用迭代器模式,为每一个集合创建一个对象的迭代器,再在聚合类中实例化该迭代器返回给客户端,这样客户端就只管遍历,而不用关心具体的集合类型了。
集合接口:主要是提供一个统一的方法来返回迭代器
package com.whut.iterator; public interface Menu { |