Iterator模式定義:
          提供一個(gè)方法順序訪問一個(gè)聚合對象的各個(gè)元素,而又不暴露該對象的內(nèi)部表示。
          這個(gè)模式在java的類庫中已經(jīng)實(shí)現(xiàn)了,在java中所有的集合類都實(shí)現(xiàn)了Conllection接口,而Conllection接口又繼承了Iterable接口,該接口有一個(gè)iterator方法,也就是所以的集合類都可以通過這個(gè)iterator方法來轉(zhuǎn)換成Iterator類,用Iterator對象中的hasnext方法來判斷是否還有下個(gè)元素,next方法來順序獲取集合類中的對象。今天面試考到設(shè)計(jì)模式,我愣是沒答上來,我暈死,自己這幾天剛學(xué)的東西,自己也都理解,可一到考試的時(shí)候不是忘了就是回答的不準(zhǔn)確,自己也不清楚到底是為什么,哎,傷心。。。。。。,下面是Iterator模式的結(jié)構(gòu)圖:

           在這個(gè)結(jié)構(gòu)圖中的Aggregate抽象類也可以定義成接口。下面給出一個(gè)例子來說明Iterator模式的使用。
          import java.util.ArrayList;

          interface Iterator<E>{
           public void first();
           public void next();
           public E currentItem();
           public boolean isDone();
          }
          class ConcreteIterator<E> implements Iterator<E>{

           private ConcreteAggregate<E> agg;
           private int index=0;
           private int size=0;

              public ConcreteIterator( ConcreteAggregate<E> aggregate) {
            this.agg=aggregate;
            this.index=0;
            this.size=aggregate.size();
           }

           public E currentItem() {
            return agg.getElement(index);
           }

           public void first() {
            index=0;
           }

           public boolean isDone() {
            if(index>=size){
             return true;
            }
            return false;
           }

           public void next() {
            if(index<size){
             index++; 
               }
           
              }
          }
          abstract class Aggregate<E>{
           
           protected abstract Iterator createIterator();
          }
          class ConcreteAggregate<E> extends Aggregate<E>{
           private ArrayList<E> arrayList=new ArrayList<E>();
           public Iterator createIterator() {
            
            return new ConcreteIterator<E>(this);
           }
           public void add(E o){
            arrayList.add(o);
           }
           public E getElement(int index) {

                 if (index<arrayList.size()) {

                   return arrayList.get(index);

                 } else {

                   return null;

                 }

              }

              public int size(){

                 return arrayList.size();

              }


          }

          public class Client {

           public static void main(String[] args) {
            ConcreteAggregate<String> aggregate=new ConcreteAggregate<String>();
            aggregate.add("A");
            aggregate.add("B");
            aggregate.add("C");
            aggregate.add("D");
            aggregate.add("E");
            Iterator iterator=aggregate.createIterator();
            for(iterator.first();!iterator.isDone();iterator.next()){
             System.out.println(iterator.currentItem());
            }
            
           }
          }
          輸出結(jié)果:
          A
          B
          C
          D
          E
          在這個(gè)例子中,我們按照Iterator模式的結(jié)構(gòu)圖來創(chuàng)建的例子,我們創(chuàng)建的集合ConcreteAggregate可以存放任何類型的數(shù)據(jù),然后使用createIterator方法轉(zhuǎn)換成Iterator對象,使用Iterator對象來按順序顯示集合中的內(nèi)容。這個(gè)模式在Java的jdk中是這樣實(shí)現(xiàn)的,所以的集合類都實(shí)現(xiàn)了Iterable接口,這個(gè)接口中有一個(gè)iterator方法可以把集合類的對象轉(zhuǎn)換成Iterator類的對象。明白這個(gè)原理可以更好的理解Java中的集合類和迭代器,根據(jù)這個(gè)可以創(chuàng)建功能更加強(qiáng)大的集合類。
          小結(jié):Iterator模式主要用在當(dāng)一個(gè)集合類中的元素經(jīng)常變動時(shí),而不需要改變客戶端的代碼。

          Feedback

          # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(十三)—Iterator迭代器模式  回復(fù)  更多評論   

          2012-01-16 10:14 by apiao
          支持下lz... 在你這學(xué)習(xí)很多了 繼續(xù)努力~

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 赞皇县| 千阳县| 东宁县| 武穴市| 邵阳市| 莫力| 柏乡县| 永年县| 岚皋县| 石渠县| 高安市| 山西省| 中方县| 宿松县| 通州区| 湄潭县| 安国市| 南召县| 乌鲁木齐市| 深水埗区| 南陵县| 福海县| 当涂县| 广汉市| 宜兰市| 太谷县| 祁门县| 宜黄县| 黔江区| 红河县| 滦南县| 鄂伦春自治旗| 本溪| 镇安县| 迭部县| 彝良县| 梓潼县| 安吉县| 黎川县| 清徐县| 轮台县|