<wbr id="jl7f7"></wbr>

        <i id="jl7f7"></i>
          <acronym id="jl7f7"></acronym>

          <s id="jl7f7"></s>

          <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>
          鍍金池/ 教程/ Java/ 迭代器模式
          訪(fǎng)問(wèn)者模式
          訪(fǎng)問(wèn)者模式討論篇:java的動(dòng)態(tài)綁定與雙分派
          責任連模式
          迭代器模式
          策略模式
          命令模式
          單例模式
          建造者模式
          解釋器模式
          工廠(chǎng)方法模式
          備忘錄模式
          原型模式
          單例模式討論篇:?jiǎn)卫J脚c垃圾回收
          觀(guān)察者模式
          模版方法模式
          創(chuàng )建類(lèi)模式總結篇
          抽象工廠(chǎng)模式
          中介者模式

          迭代器模式

          定義:提供一種方法訪(fǎng)問(wèn)一個(gè)容器對象中各個(gè)元素,而又不暴露該對象的內部細節。

          類(lèi)型:行為類(lèi)模式

          類(lèi)圖:

          http://wiki.jikexueyuan.com/project/java-design-pattern/images/iterator-pattern-1.jpg" alt="iterator-pattern" />

          如果要問(wèn)java中使用最多的一種模式,答案不是單例模式,也不是工廠(chǎng)模式,更不是策略模式,而是迭代器模式,先來(lái)看一段代碼吧:

              public static void print(Collection coll){
                  Iterator it = coll.iterator();
                  while(it.hasNext()){
                      String str = (String)it.next();
                      System.out.println(str);
                  }
              }

          這個(gè)方法的作用是循環(huán)打印一個(gè)字符串集合,里面就用到了迭代器模式,java語(yǔ)言已經(jīng)完整地實(shí)現了迭代器模式,Iterator翻譯成漢語(yǔ)就是迭代器的意思。提到迭代器,首先它是與集合相關(guān)的,集合也叫聚集、容器等,我們可以將集合看成是一個(gè)可以包容對象的容器,例如List,Set,Map,甚至數組都可以叫做集合,而迭代器的作用就是把容器中的對象一個(gè)一個(gè)地遍歷出來(lái)。

          迭代器模式的結構

          • 抽象容器:一般是一個(gè)接口,提供一個(gè)iterator()方法,例如java中的Collection接口,List接口,Set接口等。
          • 具體容器:就是抽象容器的具體實(shí)現類(lèi),比如List接口的有序列表實(shí)現ArrayList,List接口的鏈表實(shí)現LinkList,Set接口的哈希列表的實(shí)現HashSet等。
          • 抽象迭代器:定義遍歷元素所需要的方法,一般來(lái)說(shuō)會(huì )有這么三個(gè)方法:取得第一個(gè)元素的方法first(),取得下一個(gè)元素的方法next(),判斷是否遍歷結束的方法isDone()(或者叫hasNext()),移出當前對象的方法remove(),
          • 迭代器實(shí)現:實(shí)現迭代器接口中定義的方法,完成集合的迭代。

          代碼實(shí)現

              interface Iterator {
                  public Object next();
                  public boolean hasNext();
              }
              class ConcreteIterator implements Iterator{
                  private List list = new ArrayList();
                  private int cursor =0;
                  public ConcreteIterator(List list){
                      this.list = list;
                  }
                  public boolean hasNext() {
                      if(cursor==list.size()){
                          return false;
                      }
                      return true;
                  }
                  public Object next() {
                      Object obj = null;
                      if(this.hasNext()){
                          obj = this.list.get(cursor++);
                      }
                      return obj;
                  }
              }
              interface Aggregate {
                  public void add(Object obj);
                  public void remove(Object obj);
                  public Iterator iterator();
              }
              class ConcreteAggregate implements Aggregate {
                  private List list = new ArrayList();
                  public void add(Object obj) {
                      list.add(obj);
                  }
          
                  public Iterator iterator() {
                      return new ConcreteIterator(list);
                  }
          
                  public void remove(Object obj) {
                      list.remove(obj);
                  }
              }
              public class Client {
                  public static void main(String[] args){
                      Aggregate ag = new ConcreteAggregate();
                      ag.add("小明");
                      ag.add("小紅");
                      ag.add("小剛");
                      Iterator it = ag.iterator();
                      while(it.hasNext()){
                          String str = (String)it.next();
                          System.out.println(str);
                      }
                  }
              }

          上面的代碼中,Aggregate是容器類(lèi)接口,大家可以想象一下Collection,List,Set等,Aggregate就是他們的簡(jiǎn)化版,容器類(lèi)接口中主要有三個(gè)方法:添加對象方法add、刪除對象方法remove、取得迭代器方法iterator。Iterator是迭代器接口,主要有兩個(gè)方法:取得迭代對象方法next,判斷是否迭代完成方法hasNext,大家可以對比java.util.List和java.util.Iterator兩個(gè)接口自行思考。


          迭代器模式的優(yōu)缺點(diǎn)

          迭代器模式的優(yōu)點(diǎn)有:

          • 簡(jiǎn)化了遍歷方式,對于對象集合的遍歷,還是比較麻煩的,對于數組或者有序列表,我們尚可以通過(guò)游標來(lái)取得,但用戶(hù)需要在對集合了解很清楚的前提下,自行遍歷對象,但是對于hash表來(lái)說(shuō),用戶(hù)遍歷起來(lái)就比較麻煩了。而引入了迭代器方法后,用戶(hù)用起來(lái)就簡(jiǎn)單的多了。
          • 可以提供多種遍歷方式,比如說(shuō)對有序列表,我們可以根據需要提供正序遍歷,倒序遍歷兩種迭代器,用戶(hù)用起來(lái)只需要得到我們實(shí)現好的迭代器,就可以方便的對集合進(jìn)行遍歷了。
          • 封裝性良好,用戶(hù)只需要得到迭代器就可以遍歷,而對于遍歷算法則不用去關(guān)心。

          迭代器模式的缺點(diǎn):

          • 對于比較簡(jiǎn)單的遍歷(像數組或者有序列表),使用迭代器方式遍歷較為繁瑣,大家可能都有感覺(jué),像ArrayList,我們寧可愿意使用for循環(huán)和get方法來(lái)遍歷集合。

          迭代器模式的適用場(chǎng)景

          迭代器模式是與集合共生共死的,一般來(lái)說(shuō),我們只要實(shí)現一個(gè)集合,就需要同時(shí)提供這個(gè)集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的迭代器。假如我們要實(shí)現一個(gè)這樣的新的容器,當然也需要引入迭代器模式,給我們的容器實(shí)現一個(gè)迭代器。

          但是,由于容器與迭代器的關(guān)系太密切了,所以大多數語(yǔ)言在實(shí)現容器的時(shí)候都給提供了迭代器,并且這些語(yǔ)言提供的容器和迭代器在絕大多數情況下就可以滿(mǎn)足我們的需要,所以現在需要我們自己去實(shí)踐迭代器模式的場(chǎng)景還是比較少見(jiàn)的,我們只需要使用語(yǔ)言中已有的容器和迭代器就可以了。

          上一篇:模版方法模式下一篇:備忘錄模式
          日韩性做爰免费a片aa片,天天躁恨恨躁夜躁2020,精品久久综合1区2区3区激情,精产国品一二三产品麻豆

          <wbr id="jl7f7"></wbr>

                <i id="jl7f7"></i>
                  <acronym id="jl7f7"></acronym>

                  <s id="jl7f7"></s>

                  <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>