程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 應用迭代器形式來停止Java的設計形式編程

應用迭代器形式來停止Java的設計形式編程

編輯:關於JAVA

應用迭代器形式來停止Java的設計形式編程。本站提示廣大學習愛好者:(應用迭代器形式來停止Java的設計形式編程)文章只能為提供參考,不一定能成為您想要的結果。以下是應用迭代器形式來停止Java的設計形式編程正文


界說:供給一種辦法拜訪一個容器對象中各個元素,而又不裸露該對象的外部細節。
類型:行動類形式
類圖:

假如要問java中應用最多的一種形式,謎底不是單例形式,也不是工場形式,更不是戰略形式,而是迭代器形式,先來看一段代碼吧:

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

       這個辦法的感化是輪回打印一個字符串聚集,外面就用到了迭代器形式,java說話曾經完全地完成了迭代器形式,Iterator翻譯成漢語就是迭代器的意思。提到迭代器,起首它是與聚集相干的,聚集也叫集合、容器等,我們可以將聚集算作是一個可以包涵對象的容器,例如List,Set,Map,乃至數組都可以叫做聚集,而迭代器的感化就是把容器中的對象一個一個地遍歷出來。
 
迭代器形式的構造
籠統容器:普通是一個接口,供給一個iterator()辦法,例如java中的Collection接口,List接口,Set接口等。
詳細容器:就是籠統容器的詳細完成類,好比List接口的有序列表完成ArrayList,List接口的鏈表完成LinkList,Set接口的哈希列表的完成HashSet等。
籠統迭代器:界說遍歷元素所須要的辦法,普通來講會有這麼三個辦法:獲得第一個元素的辦法first(),獲得下一個元素的辦法next(),斷定能否遍歷停止的辦法isDone()(或許叫hasNext()),移出以後對象的辦法remove(),
迭代器完成:完成迭代器接口中界說的辦法,完成聚集的迭代。
 
舉例

  因為迭代器形式自己的劃定比擬松懈,所以詳細完成也就八門五花。我們在此僅舉一例,基本不克不及將完成方法逐個出現。是以在舉例前,我們先來羅列下迭代器形式的完成方法。

  1.迭代器腳色界說了遍歷的接口,然則沒有劃定由誰來掌握迭代。在Java collection的運用中,是由客戶法式來掌握遍歷的過程,被稱為內部迭代器;還有一種完成方法就是由迭代器本身來掌握迭代,被稱為外部迭代器。內部迭代器要比外部迭代器靈巧、壯大,並且外部迭代器在java說話情況中,可用性很弱。

  2.在迭代器形式中沒有劃定誰來完成遍歷算法。似乎天經地義的要在迭代器腳色中完成。由於既便於一個容器上應用分歧的遍歷算法,也便於將一種遍歷算法運用於分歧的容器。然則如許就損壞失落了容器的封裝——容器腳色就要地下本身的公有屬性,在java中便意味著向其他類地下了本身的公有屬性。

  那我們把它放到容器腳色裡來完成好了。如許迭代器腳色就被排擠為僅僅寄存一個遍歷以後地位的功效。然則遍歷算法便和特定的容器牢牢綁在一路了。

  而在Java Collection的運用中,供給的詳細迭代器腳色是界說在容器腳色中的外部類。如許便掩護了容器的封裝。然則同時容器也供給了遍歷算法接口,你可以擴大本身的迭代器。

  好了,我們來看下Java Collection中的迭代器是怎樣完成的吧。

//迭代器腳色,僅僅界說了遍歷接口

public interface Iterator {
 boolean hasNext();
 Object next();
 void remove();
}

//容器腳色,這裡以List為例。它也僅僅是一個接口,就不枚舉出來了
//詳細容器腳色,就是完成了List接口的ArrayList等類。為了凸起重點這裡指枚舉和迭代器相干的內容
//詳細迭代器腳色,它是之內部類的情勢出來的。AbstractList是為了將各個詳細容器腳色的公共部門提掏出來而存在的。

public abstract class AbstractList extends AbstractCollection implements List {
…… 
//這個就是擔任創立詳細迭代器腳色的工場辦法
public Iterator iterator() {
 return new Itr();
}

//作為外部類的詳細迭代器腳色

private class Itr implements Iterator {
 int cursor = 0;
 int lastRet = -1;
 int expectedModCount = modCount;

 public boolean hasNext() {
  return cursor != size();
 }

 public Object next() {
  checkForComodification();
  try {
   Object next = get(cursor);
   lastRet = cursor++;
   return next;
  } catch(IndexOutOfBoundsException e) {
   checkForComodification();
   throw new NoSuchElementException();
  }
 }

 public void remove() {
  if (lastRet == -1)
   throw new IllegalStateException();
   checkForComodification();

  try {
   AbstractList.this.remove(lastRet);
   if (lastRet < cursor)
    cursor--;
   lastRet = -1;
   expectedModCount = modCount;
  } catch(IndexOutOfBoundsException e) {
   throw new ConcurrentModificationException();
  }
 }

 final void checkForComodification() {
  if (modCount != expectedModCount)
   throw new ConcurrentModificationException();
 }
}

  至於迭代器形式的應用。正如引言中所列那樣,客戶法式要先獲得詳細容器腳色,然後再經由過程詳細容器腳色獲得詳細迭代器腳色。如許即可以應用詳細迭代器腳色來遍歷容器了……


迭代器形式的優缺陷
        迭代器形式的長處有:
簡化了遍歷方法,關於對象聚集的遍歷,照樣比擬費事的,關於數組或許有序列表,我們尚可以經由過程游標來獲得,但用戶須要在對聚集懂得很清晰的條件下,自行遍歷對象,然則關於hash表來講,用戶遍歷起來就比擬費事了。而引入了迭代器辦法後,用戶用起來就簡略的多了。
可以供給多種遍歷方法,好比說對有序列表,我們可以依據須要供給正序遍歷,倒序遍歷兩種迭代器,用戶用起來只須要獲得我們完成好的迭代器,便可以便利的對聚集停止遍歷了。
封裝性優越,用戶只須要獲得迭代器便可以遍歷,而關於遍歷算軌則不消去關懷。
        迭代器形式的缺陷:
關於比擬簡略的遍歷(像數組或許有序列表),應用迭代器方法遍歷較為繁瑣,年夜家能夠都有感到,像ArrayList,我們寧可情願應用for輪回和get辦法來遍歷聚集。
 
迭代器形式的實用場景
       迭代器形式是與聚集共生共逝世的,普通來講,我們只需完成一個聚集,就須要同時供給這個聚集的迭代器,就像java中的Collection,List、Set、Map等,這些聚集都有本身的迭代器。假設我們要完成一個如許的新的容器,固然也須要引入迭代器形式,給我們的容器完成一個迭代器。
       然則,因為容器與迭代器的關系太親密了,所以年夜多半說話在完成容器的時刻都給供給了迭代器,而且這些說話供給的容器和迭代器在絕年夜多半情形下便可以知足我們的須要,所以如今須要我們本身去理論迭代器形式的場景照樣比擬少見的,我們只須要應用說話中已有的容器和迭代器便可以了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved