亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

23種設(shè)計(jì)模式(14)java迭代器模式

 更新時(shí)間:2017年12月07日 09:02:36   作者:阿木俠  
這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java迭代器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

23種設(shè)計(jì)模式第十四篇:java迭代器模式

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

類型:行為類模式

類圖:

如果要問(wèn)java中使用最多的一種模式,答案不是單例模式,也不是工廠模式,更不是策略模式,而是迭代器模式,先來(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í)現(xiàn)了迭代器模式,Iterator翻譯成漢語(yǔ)就是迭代器的意思。提到迭代器,首先它是與集合相關(guān)的,集合也叫聚集、容器等,我們可以將集合看成是一個(gè)可以包容對(duì)象的容器,例如List,Set,Map,甚至數(shù)組都可以叫做集合,而迭代器的作用就是把容器中的對(duì)象一個(gè)一個(gè)地遍歷出來(lái)。

迭代器模式的結(jié)構(gòu)

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

代碼實(shí)現(xiàn)

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

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

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

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

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

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫(kù)詳解

    Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫(kù)詳解

    這篇文章主要為大家詳細(xì)介紹了Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫(kù)的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • spring Boot與Mybatis整合優(yōu)化詳解

    spring Boot與Mybatis整合優(yōu)化詳解

    關(guān)于spring-boot與mybatis整合優(yōu)化方面的介紹,就是Mybatis-Spring-boot-starter的介紹,具體內(nèi)容詳情大家參考下本文
    2017-07-07
  • java8中@Contended注解的使用

    java8中@Contended注解的使用

    本文主要介紹了java8中@Contended注解的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 解決java?try?throw?exception?finally遇上return?break?continue造成異常丟失

    解決java?try?throw?exception?finally遇上return?break?conti

    這篇文章主要介紹了解決java?try?throw?exception?finally遇上return?break?continue造成異常丟失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 解決springboot服務(wù)啟動(dòng)報(bào)錯(cuò):Unable?to?start?embedded?contain

    解決springboot服務(wù)啟動(dòng)報(bào)錯(cuò):Unable?to?start?embedded?contain

    這篇文章主要介紹了解決springboot服務(wù)啟動(dòng)報(bào)錯(cuò):Unable?to?start?embedded?contain的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java 實(shí)現(xiàn)音樂(lè)播放器的簡(jiǎn)單實(shí)例

    java 實(shí)現(xiàn)音樂(lè)播放器的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了java 實(shí)現(xiàn)音樂(lè)播放器的簡(jiǎn)單實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09
  • MyBatis-Plus將字段修改為空值的解決方案

    MyBatis-Plus將字段修改為空值的解決方案

    這篇文章主要介紹了MyBatis-Plus將字段修改為空值的解決方案,本文給大家分享三種常用的解決方案,感興趣的朋友一起看看吧
    2023-12-12
  • javaweb圖書商城設(shè)計(jì)之用戶模塊(1)

    javaweb圖書商城設(shè)計(jì)之用戶模塊(1)

    這篇文章主要介紹了javaweb圖書商城設(shè)計(jì)之用戶模塊的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 簡(jiǎn)單談?wù)凧ava 中的線程的幾種狀態(tài)

    簡(jiǎn)單談?wù)凧ava 中的線程的幾種狀態(tài)

    這篇文章主要介紹了簡(jiǎn)單談?wù)凧ava 中的線程的幾種狀態(tài)的相關(guān)資料,需要的朋友可以參考下
    2020-02-02
  • spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中

    spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中

    這篇文章主要給大家介紹了關(guān)于spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論