【注意】最后更新于 January 23, 2018,文中内容可能已过时,请谨慎使用。
本文我们来讨论下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,多此一举不是?
实际上重要的是思想!不要管这些东西!!!