一.简介
在我们使用的jdk的api中有着大量的集合容器,而这些容器需要一个统一的遍历方式,这个遍历方式就是实现iterable接口,这个接口获取一个迭代器.这个迭代器有统一的遍历方法.至于每个容器他们的具体实现细节由各个集合自己去实现.
二.结构
- 迭代器角色:定义可以对容器进行迭代的抽象方法;
- 具体迭代角色:一般存在于容器内部,它由容器来产生;
- 抽象容器角色:定义了获取迭代器角色的接口,并且有容器自己的属性,比如添加元素,删除元素;
- 具体容器角色:实现抽象容器角色,具体获取迭代器.
三.代码
版本一 具体的迭代器在具体容器的外部
interface Iterat<E> {
boolean hasNext();
E next();
}
class MyIterator implements Iterat {
LinkedList list = new LinkedList<>();
public MyIterator(LinkedList list) {
this.list = list;
}
@Override
public boolean hasNext() {
return list.size() != 0;
}
@Override
public Object next() {
return list.remove();
}
}
interface MyList<T> {
void add(T t);
void remove(T t);
MyIterator generate();
}
class MyListImpl<T> implements MyList<T>{
private LinkedList<T> list = new LinkedList();
@Override
public void add(T o) {
list.addLast(o);
}
@Override
public void remove(T o) {
list.remove(o);
}
@Override
public MyIterator generate() {
return new MyIterator(list);
}
}
public class Client {
public static void main(String[] args) {
MyListImpl<Integer> myList = new MyListImpl();
myList.add(1);
myList.add(2);
myList.add(3);
myList.add(5);
MyIterator generate = myList.generate();
while (generate.hasNext()){
System.out.println(generate.next());
}
}
}
版本二 具体的迭代器在具体容器的内部
jdk自己的实现方式,这种方式明显更好维护,具体的迭代器只和具体的容器有关系,和其他的类并没有关系,这样的代码结构明显更能满足我们的阅读需要.
package iterator.two;
import java.util.LinkedList;
/**
* Created by ZouHaiBo on 2018/2/2.
*/
interface Iterat<E> {
boolean hasNext();
E next();
}
interface MyList<T> {
void add(T t);
void remove(T t);
Iterat generate();
}
class MyListImpl<T> implements MyList<T> {
private LinkedList<T> list = new LinkedList();
@Override
public void add(T o) {
list.addLast(o);
}
@Override
public void remove(T o) {
list.remove(o);
}
@Override
public Iterat generate() {
return new MyIterator(list);
}
class MyIterator<E> implements Iterat<E> {
LinkedList<E> list = new LinkedList<>();
public MyIterator(LinkedList<E> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return list.size() != 0;
}
@Override
public E next() {
return list.remove();
}
}
}
public class Client {
public static void main(String[] args) {
MyListImpl<String> myList = new MyListImpl<>();
myList.add("absd");
myList.add("sdk");
myList.add("5251");
myList.add("sdaf");
Iterat generate = myList.generate();
while (generate.hasNext()){
System.out.println(generate.next());
}
}
}
// 输出
//absd
//sdk
//5251
//sdaf
四.特点
- 高内聚,在版本二的代码里面,单一职能在一个结构体里面得到了完全的实现;
- 扩展性强:如果有一个新的容器,它需要有迭代器这个需要的话,也是只需要继承iterable接口,实现获取迭代器的方法,在本类中添加一个迭代器,即可完成对容器的遍历;
- 符合了封装的特点:每个具体的容器自己实现自己的迭代具体的逻辑,而客户端并不需要直到它们的具体实现,只需要知道顶层的迭代接口即可.
五.参考文献
大话设计模式