一、概述
一看到Iterator,相信大家都很熟悉,没错,Iterator就是你们熟悉的它,主要功能就是迭代对象进行遍历,由于它太太太普遍了,所以Java已经将它融为到语言中了。在jdk中也提供了java.util.Iterator接口,并应用于各个集合当中,我们可以用集合中的iterator()方法进行遍历,不需要我们再额外自己去写迭代器的方法了,所以迭代器模式也显得不那么重要了。但其实它算是使用频率最高的模式之一了,只是不需要我们自己去设计了,而是已经被设计在我们常常使用的集合之中了。
但作为23种常用的设计模式之一,这里我还是对迭代器模式做一个简单的学习和总结。
二、迭代器模式
1. 定义
迭代器模式,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。(引自《大话设计模式》)
2. 基本结构
Aggregate:聚集抽象类。
ConcreteAggregate:具体聚集类,实现了创建迭代器对象的方法。
MyIterator:迭代器抽象类,主要提供了4个统一接口——得到开始对象、得到下一对象、是否是最后一个、得到当前对象,这里的方法根据需求可以随意增减。
ConcreteIterator:具体迭代器类。
3. 一些说明
jdk中已经提供了Iterator接口,包含了如下方法:
所以,如果这些方法已经可以满足当前需求时,可直接让ConcreteIterator继承Iterator即可,或者让MyIterator继承Iterator,然后在MyIterator中进行一些新方法的补充。
类图已经很清晰了,下面我从一个实际例子出发进一步说明此模式。
三、实战应用
举个例子说明,很简单的例子,现在要遍历某部门的员工信息。
用类图分析一下吧
我这里面的IMyIterator就继承了Iterator,而且我没有写新的方法,因为Iterator中的hasNext()和next()方法已经可以满足我目前的需求,从现在这个需求来说,可以省略IMyIterator,让ConcreteIterator直接继承Iterator也可以。
看一下代码实现~
IPerson
/**
* 聚集抽象类
*/
public interface IPerson {
public void add(String name,int age,String sex);//新增员工:姓名,年龄,性别
public String gerInfo();//获取员工信息
public IMyIterator iterator();//遍历员工
}
IMyIterator
/**
* 迭代抽象类
*/
public interface IMyIterator extends Iterator<IPerson>{
}
ConcretePerson,这里包含了name,age,sex三个员工属性,也可以用实体类来表示,这里为了简便只是罗列了出来。
public class ConcretePerson implements IPerson {
private List<IPerson> personList = new ArrayList<IPerson>();//声明员工集合
private String name;
private int age;
private String sex;
public ConcretePerson() {
super();
}
public ConcretePerson(String name,int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public void add(String name,int age,String sex) {
this.personList.add(new ConcretePerson(name,age,sex));
}
@Override
public String gerInfo() {
return "员工姓名:"+this.name+",员工年龄:"+String.valueOf(this.age)+",员工性别:"+this.sex;
}
@Override
public IMyIterator iterator() {
return new ConcreteMyIterator(this.personList);
}
}
ConcreteMyIterator
public class ConcreteMyIterator implements IMyIterator {
private List<IPerson> personList = new ArrayList<IPerson>();//声明员工集合
private int current = 0;
public ConcreteMyIterator(List<IPerson> personList) {
this.personList = personList;
}
@Override
public boolean hasNext() {
return current >= personList.size() ? false : true;
}
@Override
public IPerson next() {
IPerson p = personList.get(current);
current++;
return p;
}
}
测试类
public class IteratorTest {
public static void main(String[] args) {
//声明聚集对象
IPerson person = new ConcretePerson();
//来新员工了~~~
person.add("张三", 20, "男");
person.add("李四", 19, "男");
person.add("韩梅梅", 18, "女");
//遍历
IMyIterator i = person.iterator();
while(i.hasNext()) {
IPerson p = i.next();
System.out.println(p.gerInfo());
}
}
}
结果
从类图和具体代码实现来看,整个结构还是比较清晰的,但其实从实际来说,如果只是简单的遍历,我们无需如此周张的用几个类来实现遍历,只要简单的遍历list即可。其实list的底层实现也是迭代,就相当于在使用迭代器模式了,这里只是简单举个例子进行说明该模式,在实际应用中,还是要从需求出发,采用更便捷的方式才好。
写在最后,
本文主要是小猫看了《大话设计模式》的一些记录笔记,再加之自己的一些理解整理出此文,方便以后查阅,仅供参考。