迭代器模式:
- 提供一种方法访问一个容器中的各个元素,而又不暴露该对象的内部细节。
- 属于行为类模式
- 迭代器模式也是使用较多的一种模式。
遍历集合时,就必须先获得集合的iterator迭代器再遍历。这里的iterator就属于迭代器模式
结构:
- 抽象容器:一般是一个接口,提供一个iterator()方法。
例如java中的Collectiion接口。List接口,Set接口。 - 具体容器:抽象容器的具体实现类。
例如List接口的列表实现类ArrayList、LinkList;Set接口的实现类。 - 抽象迭代器:定义遍历元素所需要的方法。
一般来说会有三个方法:取得第一个元素的方法first();
取得下一个元素的方法next();判断是否便利结束的方法hasNext();
移出当前对象的方法remove()。 - 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。
以下代码实现:
/**
*
* 生如逆旅单行道, 哪有岁月可回头。
*
* @Title Iterator.java
* @Package iterator
* @Description: 抽象接口容器
* @author Young
* @date 2018年1月10日 下午7:15:39
* @version V1.0
*/
interface Iterator {
Object next();
boolean hasNext();
}
import java.util.ArrayList;
import java.util.List;
/**
*
* 生如逆旅单行道, 哪有岁月可回头。
*
* @Title ConcreteIterator.java
* @Package iterator
* @Description: 抽象迭代器
* @author Young
* @date 2018年1月10日 下午7:15:22
* @version V1.0
*/
public class ConcreteIterator implements Iterator {
private List list=new ArrayList();
private int cursor=0;
public ConcreteIterator(List list){
this.list=list;
}
/*
* 相当于集合遍历中Iterator的next方法
* 调用本类中的hasNext()
* 如果集合中还有下一个元素就获取下一个元素
*/
@Override
public Object next() {
Object obj=null;
if(this.hasNext()){
obj=this.list.get(cursor++);
}
return obj;
}
/*
*判断是否还有下一个
*类似于集合中Iterator中的hasNext方法
*如果传入的list结合的大小等于是、初始长度
*就说明集合中已经没有下一个元素,返回false。
*/
@Override
public boolean hasNext() {
if(cursor==list.size()){
return false;
}
return true;
}
}
/**
*
* 生如逆旅单行道, 哪有岁月可回头。
*
* @Title Aggregate.java
* @Package iterator
* @Description: 抽象迭代器
* @author Young
* @date 2018年1月10日 下午7:11:44
* @version V1.0
*/
interface Aggregate {
void add(Object obj);
void remove(Object obj);
public Iterator iterator();
}
import java.util.ArrayList;
import java.util.List;
/**
*
* 生如逆旅单行道, 哪有岁月可回头。
*
*
* @Title ConcreteAggregate.java
* @Package iterator
* @Description: 迭代器实现
* @author Young
* @date 2018年1月10日 下午7:13:52
* @version V1.0
*/
public class ConcreteAggregate implements Aggregate{
private List list=new ArrayList();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator iterator() {
return new ConcreteIterator(list);
}
}
public class Test {
public static void main(String[] args) {
//根据抽象迭代器接口实例化它的实现类
Aggregate ag=new ConcreteAggregate();
//使用ConcreteAggregate类重写的方法往list中增加对象
ag.add("小明");
ag.add("小红");
ag.add("小刚");
//根据抽象迭代器接口对象调用iterator方法获得迭代器迭代器对象
Iterator it=ag.iterator();
//遍历迭代器的实现类中的list集合
//使用hasNext方法和next方法。实现遍历。
while(it.hasNext()){
String str = (String) it.next();
System.out.println(str);
}
}
}
在练习中 Aggregate是容器类接口,
大家可以想像一下Collection、List、Set容器类接口中主要有三个方法:添加对象方法add、删除对象方法remove、取得迭代器方法iterator
其中iterator是迭代器接口,主要有两个方法:取得迭代对象方法next,判断是否迭代完成方法hasNext
迭代模式的优缺点:
优点:
简化了遍历方法。对于数组或者有序列表还可以通过下标来取得,
但是对于对象集合的遍历,由于某些集合不可重复,
得先比较hash值再比较内存地址再次equals用户遍历起来很麻烦。
引入了迭代器模式后,用户使用就简单很多。可以提供多种遍历方法,因为我们是以接口方法提供的。
比如说对有序列表,可以根据需要提供正序排序,倒序遍历两种迭代器。
用户使用起来只需要得到我们实现好的迭代器,就可以很方便的进行遍历。封装性良好,继承性和可扩展性强。
缺点:
对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,比如像ArrayList,我们用foreach循环效率更高点。
迭代模式的使用场景:
- 迭代器模式是与集合共生共死的,一般来说,我们只要实现了一个集合,就需要同时提供这个集合的迭代器。
- 就像java中的Collection、List、Set、Map等,这些集合都有自己的迭代器。
- Java中的迭代器已经足够我们使用。我们主要是掌握迭代器的思想。