迭代器模式
学到现在渐渐的感觉抓到一点点感觉,那就是学习模式的时候先看定义然后,尝试理解它,理解目的不管百度还是查资料也好,这样不管模式有多复杂,但是目的不会变,理解他的思想后就简单很多。
迭代器模式(Iterator ):提供一种方法顺序访问聚合对象中的每个元素,而不是暴露其内部表示。
迭代器模式的定义并不难理解就是就是遍历聚合对象中的每个元素,只不过有前提就是了。
class HarryPotterCD{
private List list;
public HarryPotterCD(){
list=new ArrayList();
list.add("哈利·波特与火焰杯");
list.add("哈利·波特与凤凰社");
list.add("哈利·波特与混血王子");
list.add("哈利·波特与死亡圣器");
}
}
class HarryPotterBook{
private String[] str;
public HarryPotterBook(){
str=new String[7];
str[0]="哈利·波特与魔法石";
str[1]="哈利·波特与密室";
str[2]="哈利·波特与阿兹卡班囚徒";
}
}
上面有一整套哈利波特,但是有三本是书有四季的的电影,要求一起遍历他们。
首先抽象,然后需要一个迭代器
abstract class HarryPotter{
public abstract Iterator createIterator();
}
interface Iterator{
boolean hasNext();
Object next();
void printAll();
}
然后需要各自的迭代器去遍历他们
class CDIterator implements Iterator{
private List list;
private int index=0;
public CDIterator(List list){
this.list=list;
}
@Override
public boolean hasNext() {
if(index<=list.size()-1){
return true;
}
return false;
}
@Override
public Object next() {
Object ob=list.get(index);
index++;
return ob;
}
@Override
public void printAll(){
while(hasNext()){
System.out.println(next().toString());
}
}
}
class BookIterator implements Iterator{
private String[] hp;
private int index=0;
public BookIterator(String[] hp){
this.hp=hp;
}
@Override
public boolean hasNext() {
if(index<= hp.length-1){
return true;
}
return false;
}
@Override
public Object next() {
Object ob=hp[index];
index++;
return ob;
}
@Override
public void printAll(){
while(hasNext()){
System.out.println(next().toString());
}
}
}
最后看看测试输出
public class Client {
public static void main(String[] args){
HarryPotter book=new HarryPotterBook();
HarryPotter CD=new HarryPotterCD();
Iterator it=book.createIterator();
it.printAll();
it=CD.createIterator();
it.printAll();
}
}
输出的是:
哈利·波特与魔法石
哈利·波特与密室
哈利·波特与阿兹卡班囚徒
哈利·波特与火焰杯
哈利·波特与凤凰社
哈利·波特与混血王子
哈利·波特与死亡圣器
我还特地跑过去看了下java.util里面的Iterator、ListIterator、ArrayList的源码其实思想是一样的,只不过官方把具体的迭代器写成内部类放在ArrayList里面
迭代器的组成:
抽象迭代器(Iterator):所有迭代器都需要实现的接口,提供了游走聚合对象元素之间的方法。
具体迭代器(ConcreteIterator):利用这个具体的迭代器能够对具体的聚合对象进行遍历。每一个聚合对象都应该对应一个具体的迭代器。
抽象聚合类(Aggregate):聚合定义创建相应迭代器对象的接口
具体聚合类 (ConcreteAggregate):实现creatorIterator()方法,返回该聚合对象的迭代器。
UML