欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java迭代子模式詳解

 更新時間:2016年02月04日 10:54:01   作者:wangxin0314  
這篇文章主要為大家詳細介紹了java迭代子模式的相關(guān)資料,需要的朋友可以參考下

迭代子(Iterator)模式的結(jié)構(gòu):
迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內(nèi)部表象。
迭代子可分為外稟迭代子內(nèi)稟迭代子
外稟迭代子:適合于白箱聚集(白箱聚集就是向外界提供訪問自己內(nèi)部元素接口的聚集),由于迭代的邏輯是由聚集對象本身提供的,所以這樣的外稟迭代子角色往往僅僅保持迭代的游標位置。所以具體迭代子角色是一個外部類,它的構(gòu)造函數(shù)接受一個具體聚集對象,從而可以調(diào)用這個聚集對象的迭代邏輯。
內(nèi)稟迭代子:適用于黑箱聚集(黑箱聚集不向外部提供遍歷自己元素對象的接口),由于黑箱聚集的元素對象只可以被聚集內(nèi)部成員訪問,所以內(nèi)稟迭代子只能是聚集內(nèi)部的成員子類。
簡單示范:

package test.edu.inter; 
 
public interface IteratorObj { 
  
  /** 
  * 移動到第一個元素 
  */ 
 public void first(); 
 /** 
  * 移動到下一個元素 
  */ 
 public boolean hasNextItem(); 
 /** 
  * 返還當(dāng)前元素 
  */ 
 public Object currentItem(); 
 
} 


package test.edu.inter; 
 
public interface DataSet { 
 public IteratorObj getIterator(); 
} 



package test.edu.inter; 
 
 
public class Iterator1 implements IteratorObj { 
  
 private Dataobj set; 
 private int size; 
 private int index=0; 
  
 public Iterator1(Dataobj set){ 
  this.set = set; 
  this.size = set.getSize(); 
 } 
 
 @Override 
 public void first() { 
  // TODO Auto-generated method stub 
  this.index = 0; 
 } 
  
 @Override 
 public boolean hasNextItem() { 
  if(index<size){ 
   return true; 
  } 
  return false; 
 } 
 
 @Override 
 public Object currentItem() { 
  Object ob = set.getItem(index); 
  if(index<size){ 
   index++; 
  } 
  return ob; 
 } 
} 



package test.edu.inter; 
 
public class Dataobj implements DataSet { 
  
 private Object[] objArray = null; 
  /** 
   * 傳入聚合對象 
   */ 
 public Dataobj(Object[] objArray){ 
   this.objArray = objArray; 
  } 
  
 @Override 
 public IteratorObj getIterator() { 
  return new Iterator1(this); 
 } 
  
 public Object getItem(int index){ 
  return objArray[index]; 
 } 
 public int getSize(){ 
  return objArray.length; 
 } 
} 



package test.edu.inter; 
 
public class Client { 
 
 /** 
  * @param args 
  */ 
 public static void main(String[] args) { 
  // TODO Auto-generated method stub 
  String[] str={"12312","dasda","dasd","12d","asd"}; 
  Dataobj ao = new Dataobj(str); 
  IteratorObj io = ao.getIterator(); 
  while(io.hasNextItem()){ 
   System.out.println(io.currentItem()); 
  } 
 } 
} 

運行結(jié)果:

12312 
dasda 
dasd 
12d 
asd 

內(nèi)容擴充:在java聚集中的應(yīng)用
在java.util.Collection接口提供iterator()工廠方法返回一個Iterator類型對象,Collection接口的子類型AbstractList類的內(nèi)部成員類Itr實現(xiàn)Iterator接口。所以Itr是內(nèi)稟迭代子類,但是AbstractList也提供了自己的遍歷方法,所以它不是黑箱聚集,而是白箱聚集。其代碼如下:

import java.util.Iterator;
public interface Itr extends Iterator{
   //再次調(diào)用next()方法時所用的指標
   int cursor = 0;
   //最近一次調(diào)用時所用的指標
   int lastRet = -1;
   int expectedModCount = modCount;
   public boolean hasNext(){
     return cursor!=size();
   }
   public Object next(){
     try{
       Object next = get(cursor);
       checkForComodification();
       lastRet = cursor++;
       return next;
     }catch(IndexOutOfBoundsException e){
       checkForComodification();
       throw new NoSuchElementException();
     }
   }
   //刪除最后遍歷過的元素,remove()方法只能刪除最后遍歷的元素
   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();
     }
   }
   public void checkForComodification(){
     if(modCount!=expectedModCount)
       throw new ConcurrentModificationException();
   }
}

其中的modCount、get(cursor)等變量和方法均是AbstractList類所擁有,Itr可以直接使用。方法checkForComodification()會檢查聚集的內(nèi)容是否剛剛被外界直接修改過(不是通過迭代子提供的remove()方法修改的)。如果在迭代子開始后,聚集的內(nèi)容被外界繞過迭代子對象而直接修改過年話,這個方法立即拋出異常。
另外:AbstractList類也提供了listIterator()方法,返回一個實現(xiàn)了Listiterator接口的類ListItr實例。ListIterator接口實現(xiàn)了正向迭代和逆向迭代,同時還提供了在迭代過程當(dāng)中安全修改列的內(nèi)容的方法。
Enumeration與Iterator的區(qū)別:(1)Enumeration沒有remove方法(2)Enumeration是在Vector中的element()方法中作用一個無名類實現(xiàn)的,它不支付Fail Fast,也就是說在迭代過程中,聚集對象被外界意外直接修改,則這個迭代過程還會立即捕獲任何異常。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 修改Springboot默認序列化工具Jackson配置的實例代碼

    修改Springboot默認序列化工具Jackson配置的實例代碼

    這篇文章主要介紹了如何修改Springboot默認序列化工具Jackson的配置,當(dāng)Spring容器中存在多個同類型的Bean時,默認情況下最后一個創(chuàng)建的Bean將作為首選Bean,文中通過代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Spring注解配置IOC,DI的方法詳解

    Spring注解配置IOC,DI的方法詳解

    這篇文章主要為大家介紹了vue組件通信的幾種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Spring Boot  Excel文件導(dǎo)出下載實現(xiàn)代碼

    Spring Boot Excel文件導(dǎo)出下載實現(xiàn)代碼

    這篇文章帶領(lǐng)我們直接實現(xiàn)Excel文件的直接導(dǎo)出下載,后續(xù)開發(fā)不需要開發(fā)很多代碼,直接繼承已經(jīng)寫好的代碼,增加一個Xml配置就可以直接導(dǎo)出。具體實現(xiàn)代碼大家跟隨小編一起通過本文學(xué)習(xí)吧
    2018-11-11
  • mybatis使用pagehelper插件過程詳解

    mybatis使用pagehelper插件過程詳解

    這篇文章主要介紹了mybatis使用pagehelper插件過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說明

    SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說明

    這篇文章主要介紹了SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java 用Prometheus搭建實時監(jiān)控系統(tǒng)過程詳解

    Java 用Prometheus搭建實時監(jiān)控系統(tǒng)過程詳解

    這篇文章主要介紹了用Prometheus搭建實時監(jiān)控系統(tǒng)過程詳解之上帝之火,普羅米修斯的崛起,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java可以寫android的應(yīng)用程序嗎

    Java可以寫android的應(yīng)用程序嗎

    在本篇文章里小編給大家整理的是一篇關(guān)于Java可以寫android的應(yīng)用程序嗎的相關(guān)基礎(chǔ)文章,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • Java性能優(yōu)化之?dāng)?shù)據(jù)結(jié)構(gòu)實例代碼

    Java性能優(yōu)化之?dāng)?shù)據(jù)結(jié)構(gòu)實例代碼

    這篇文章主要介紹了Java性能優(yōu)化之?dāng)?shù)據(jù)結(jié)構(gòu)實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Spring?Security過濾器鏈加載執(zhí)行流程源碼解析

    Spring?Security過濾器鏈加載執(zhí)行流程源碼解析

    Spring?Boot?對于?Spring?Security?提供了自動化配置方案,可以使用更少的配置來使用?Spring?Security。那么這個過濾器鏈是怎么加載和實現(xiàn)攔截的呢,對Spring?Security過濾器鏈加載執(zhí)行流程感興趣的朋友一起看看吧
    2021-12-12
  • JAVA加密算法- 非對稱加密算法(DH,RSA)的詳細介紹

    JAVA加密算法- 非對稱加密算法(DH,RSA)的詳細介紹

    這篇文章主要介紹了JAVA加密算法- 非對稱加密算法(DH,RSA),詳細介紹了DH,RSA的用法和示例,需要的朋友可以了解一下。
    2016-11-11

最新評論