迭代模式
迭代模式(Iterator)
迭代模式是行为模式之一,他把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式。
不使用迭代模式存在的问题:
- 由容器自己实现顺序遍历。直接在容器类里直接添加顺序遍历方法。(容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能)
- 让调用者自己实现遍历。直接暴露数据细节给外部。(往往容器在遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹在一起,很容易引起混乱和程序运行错误)
Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单的说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。
所以,Iterator模式的应用场景可以归纳为满足以下几个条件:
- 访问容器中包含的内部对象
- 按顺序访问
1. 迭代模式中的角色及其职责
1.1 Iterator(迭代器接口)
该接口必须定义实现迭代功能的最小定义方法集,比如提供hasNext()和next()方法
我这里用的用的就是Java自带的 java.util.Iterator
1.2 Concrete Iterator(迭代器实现类)
迭代器接口Iterator的实现类,可以根据具体情况加以实现
我这里用的一个内部类放在容器实现类的里面:
private class Itr implements Iterator {
@Override
public boolean hasNext() {
if (index >= personList.size()){
return false;
}else {
return true;
}
}
@Override
public Object next() {
return personList.get(index++);
}
@Override
public void remove() {
}
}
1.3 Aggregate (容器接口)
定义基本功能以及提供类似Iterator iterator()的方法
PersonList
package com.liuyao;
import java.util.Iterator;
/**
* @author liuyao
* @date 2018/08/05
*/
public interface PersonList {
public void addPerson(Person person);
public void delPerson(Person person);
public Iterator iterator();
}
1.4 Concrete Aggregate(容器实现类)
容器接口的实现类,必须实现Iterator iterator()方法
PersonListImpl
package com.liuyao;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author liuyao
* @date 2018/08/05
*/
public class PersonListImpl implements PersonList{
private List<Person> personList;
private int index;
public PersonListImpl() {
personList=new ArrayList<>();
}
@Override
public void addPerson(Person person){
personList.add(person);
}
@Override
public void delPerson(Person person){
personList.remove(person);
}
@Override
public Iterator iterator(){
return new Itr();
}
private class Itr implements Iterator {
@Override
public boolean hasNext() {
if (index >= personList.size()){
return false;
}else {
return true;
}
}
@Override
public Object next() {
return personList.get(index++);
}
@Override
public void remove() {
}
}
}
Main
package com.liuyao;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
PersonList personList=new PersonListImpl();
Person person1=new Person("aaa",12);
Person person2=new Person("bbb",14);
Person person3=new Person("ccc",16);
personList.addPerson(person1);
personList.addPerson(person2);
personList.addPerson(person3);
Iterator iterator=personList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
//Person{name='aaa', age=12}
//Person{name='bbb', age=14}
//Person{name='ccc', age=16}
2. 迭代模式的优点
- 实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
- 隐藏容器的实现细节。
- 为容器或其子容器提供了一个统一接口,一个方面方便调用;另一个方面使得调用者不必关注迭代器的实现细节。
- 可以为容器或其子容器实现不同的迭代方法或多个迭代方法。