設計模式之Iterator——點名篇

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

上了這麼多年學,我發現一個問題,好象老師都很喜歡點名,甚至點名都成了某些老師的嗜好,一日不點名,就飯喫不香,覺睡不好似的,我就覺得很奇怪,你的課要是講的好,同學又怎麼會不來聽課呢,殊不知:“誤人子弟,乃是犯罪!”啊。

好了,那麼我們現在來看老師這個點名過程是如何實現吧:

 

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<present.length){

      return present[index];

    }

    else{

      return null;

    }

  }

  public int getSize(){

    return present.length;  //得到同學出勤集合的大小,也就是說要知道班上有多少人

  }

}

3、定義點名(Iterator)接口類:

public interface Iterator {

  void first();  //第一個

  void next();   //下一個

  boolean isDone();  //是否點名完畢

  Object currentItem();  //當前同學的出勤情況

}

4、具體的點名(ConcreteIterator)類是對點名(Iterator)接口的實現:

public class ConcreteIterator implements Iterator{

  private ConcreteTeacher teacher;

  private int index = 0;

  private int size = 0;

  public ConcreteIterator(ConcreteTeacher teacher){

    this.teacher = teacher;

    size = teacher.getSize(); //得到同學的數目

    index = 0;

  }

  public void first(){  //第一個

    index = 0;

  }

  public void next(){ //下一個

    if(index<size){

      index++;

    }

  }

  public boolean isDone(){ //是否點名完畢

    return (index>=size);

  }

  public Object currentItem(){ //當前同學的出勤情況

    return teacher.getElement(index);

  }

}

5、編寫測試類:

public class Test {

  private Iterator it;

  private Teacher teacher = new ConcreteTeacher();

  public void operation(){

    it = teacher.createIterator();  //老師開始點名

    while(!it.isDone()){ //如果沒點完

      System.out.println(it.currentItem().toString()); //獲得被點到同學的情況

      it.next();   //點下一個

    }

  }

  public static void main(String agrs[]){

    Test test = new Test();

    test.operation();

  }

}

6、說明:

A:定義:Iterator模式可以順序的訪問一個聚集中的元素而不必暴露聚集的內部情況。

B:在本例中, 老師(Teacher)給出了創建點名(Iterator)對象的接口,點名(Iterator)定義了遍歷同學出勤情況所需的接口。

C:Iterator模式的優點是當ConcreteTeacher)對象中有變化是,比如說同學出勤集合中有加入了新的同學,或減少同學時,這種改動對客戶端是沒有影響的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章