本文我们来讨论下java设计模式之迭代器模式。

实际上,迭代器模式已经很成熟了,完全都没必要我们亲自去实现了。我们常用的list,set均实现了迭代器模式。 但是,我们需要注意的是,迭代器的思想很是重要,在我们需要进行大量遍历操作的时候应用价值比较高。 我们来想一下,如果要对一个数据进行迭代操作,最核心的是要能够查看是否具有下一个以及读取出来,也就是需要有hasNext()next()这个两个核心功能,其他的都是可以再进行添加的。 我们用书架来进行举例。

1
2
3
4
5
public interface IShelter {
    public void add(String name,int price);
    public String getInfo();
    public IShelterIterator shelterIterator();
}

毕竟是java嘛,设计模式,所以我们需要接口来进行操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Shelter implements IShelter {


    private String name;
    private int cost;
    private List<Shelter> shelterList=new ArrayList<>();


    public Shelter() {
    }

    public Shelter(String name, int cost) {
        this.name = name;
        this.cost = cost;
    }

    @Override
    public void add(String name, int price) {
        this.shelterList.add(new Shelter(name,price));
    }

    @Override
    public String getInfo() {
        return "Shelter{" +
                "name='" + name + '\'' +
                ", cost=" + cost +
                '}';
    }

    @Override
    public IShelterIterator shelterIterator() {
        return new ShelterIterator(this.shelterList);
    }

}

这个地方有了一个迭代器,是获取书架上书的内容的迭代。看下具体是怎么定义的。

1
2
public interface IShelterIterator extends Iterator {
}

为什么会继承一个Iterator类?因为我不想自己去写那几个函数接口了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ShelterIterator implements IShelterIterator {

    private List sheleterList;
    private int index=0;

    public ShelterIterator(List sheleterList) {
        this.sheleterList = sheleterList;
    }

    @Override
    public boolean hasNext() {
        if (index >= sheleterList.size() || sheleterList.get(index) == null){
            return false;
        }
        return true;
    }

    @Override
    public Object next() {
        return sheleterList.get(index++);
    }
}

不复杂吧,就是把内容取出来而已。我们看下具体的操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class Client {
    public static void main(String[] args) {
        Shelter shelter=new Shelter();
        shelter.add("computer",30);
        shelter.add("c++",50);
        shelter.add("math",20);
        IShelterIterator iterator=shelter.shelterIterator();
        while (iterator.hasNext()){
            IShelter s= (IShelter) iterator.next();
            System.out.println(s.getInfo());
        }
    }
}

完成! .....................分割线........................ 可能我们这样看起来,还没使用List方便呢!而且在shelter里面就有一个shelter,多此一举不是? 实际上重要的是思想!不要管这些东西!!!