设计模式之 Iterator —— 点名篇
上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟,乃是犯罪!”啊。
好了,那么我们现在来看老师这个点名过程是如何实现吧:
1、老规矩,我们先定义老师(Teacher)接口类:
public interface Teacher {
public Iterator createIterator(); //点名
}
2、具体的老师(ConcreteTeacher)类是对老师(Teacher)接口的实现:
public class ConcreteTeacher implements Teacher{
private Object[] present = {"张三来了","李四来了","王五没来"}; //同学出勤集合
public Iterator createIterator(){
return new ConcreteIterator(this); //新的点名
}
public Object getElement(int index){ //得到当前同学的出勤情况
if(index
1<present.length){ (index="" 3、定义点名(iterator)接口类:="" 4、具体的点名(concreteiterator)类是对点名(iterator)接口的实现:="" boolean="" class="" concreteiterator="" concreteiterator(concreteteacher="" concreteteacher="" currentitem();="" else{="" first();="" first(){="" getsize(){="" if(index<size){="" implements="" index="0;" index++;="" int="" interface="" isdone();="" isdone(){="" iterator="" iterator{="" next();="" next(){="" null;="" object="" present.length;="" present[index];="" private="" public="" return="" size="teacher.getSize();" teacher){="" teacher;="" this.teacher="teacher;" void="" {="" }="" 下一个="" 当前同学的出勤情况="" 得到同学出勤集合的大小,也就是说要知道班上有多少人="" 得到同学的数目="" 是否点名完毕="" 第一个="">=size);
2
3}
4
5public Object currentItem(){ //当前同学的出勤情况
6
7return teacher.getElement(index);
8
9}
10
11}
12
135、编写测试类:
14
15public class Test {
16
17private Iterator it;
18
19private Teacher teacher = new ConcreteTeacher();
20
21public void operation(){
22
23it = teacher.createIterator(); //老师开始点名
24
25while(!it.isDone()){ //如果没点完
26
27System.out.println(it.currentItem().toString()); //获得被点到同学的情况
28
29it.next(); //点下一个
30
31}
32
33}
34
35public static void main(String agrs[]){
36
37Test test = new Test();
38
39test.operation();
40
41}
42
43}
44
456、说明:
46
47A: 定义: Iterator 模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部情况。
48
49B :在本例中, 老师( Teacher)给出了创建点名(Iterator)对象的接口,点名(Iterator)定义了遍历同学出勤情况所需的接口。
50
51C: Iterator 模式的优点是当 ( ConcreteTeacher)对象中有变化是,比如说同学出勤集合中有加入了新的同学,或减少同学时,这种改动对客户端是没有影响的。
52
53转自: http://blog.csdn.net/lxgljj/archive/2004/10/22/146827.aspx</present.length){>