迭代器模式和Java

大家好,在本文中,我們將檢查Iterator Pattern 。 我知道你們中許多人已經使用過一種設計模式,但是也許您沒有意識到它是模式,或者不知道它的巨大價值。 根據《 Head First Design 》一書:

迭代器模式提供了一種在不暴露其底層表示的情況下順序訪問聚合對象的元素的方法。
哇啊? 好吧,它表示無論您使用什么數據結構(數組,列表,哈希表等),如果實現此模式,都可以以相同的方式遍歷它。 它為您提供了一種訪問數據結構(聚合)元素的統一方法,但您不必知道哪種數據結構 您正在遍歷...很好! 同樣,它在Iterator對象上而不是在數據結構上設置迭代的責任,從而簡化了數據結構中的編碼。 讓我們檢查一下Iterator模式的經典類圖:

Iterator Pattern的實際類圖進行了一些更改,特別是在Iterator類(接口)中,現在我們將在稍后看到不同的方法,但是首先讓我們回顧一下以前的每個類(或接口) ):

  • Aggregate :這是我們數據結構的基類(或接口),您可以將其視為java.util.Collection接口,它為集合類定義了許多方法。
  • ConcreteAggregate :這是我們將要迭代的具體數據結構,例如java.util.ArrayList , java.util.Vector等。
  • 迭代器迭代器的基類(或接口)。 您可以通過java.util.Iterator在Java 中找到一個。 您會注意到Java版本有不同的方法,我們將在本文后面討論。 在這里,您定義了遍歷數據結構所需的de方法。
  • ConcreteIterator :當您要遍歷不同的數據結構時,需要不同的迭代器。 因此,concreteIterator是要遍歷的數據結構的Iterator。

現在,讓我們看一下Iterator Pattern的Java實現。 下圖是使用Architexa的免費代碼理解工具生成的 ,它顯示了Java Collections Framework的某些類之間的關系,在這里我們可以看到類似于經典類圖的結構:

上圖僅顯示了Java模式的一種實現,還有很多,但它們始終使用java.util.Iterator接口; 這是在用Java進行編碼時應在Iterator Pattern的實現中使用的接口。 讓我們比較兩個圖:

經典圖
骨料
混凝土骨料
迭代器
ConcreteIterator

請注意,Java示例中Iterator對象的方法與經典類圖中的方法不同:

  • 沒有+ First()方法。 如果需要轉到第一個元素,則必須實例化一個新的迭代器。
  • + IsDone()方法已重命名為+ hasNext()。
  • + Next()和+ CurrentItem()已合并到+ next()中。
  • + remove()方法已添加。

因此,如果您不得不使用不同的數據結構,并且需要一種統一的方式遍歷它們和/或訪問它們的項,請考慮一下迭代器模式:

//... in a class/*** Traverse a list, hashtable, vector, etc. what ever that implements* the Iterator Pattern*/public void traverse(Iterator iter){while(iter.hasNext()){System.out.println(iter.next());}}

當然,您始終必須為數據結構創建ConcreteIterator類,但是如果您使用的是
Java Collections Framework ,它已經完成。

最后一件事,請記住最重要的OO原則: 始終使用滿足您需求的最簡單解決方案,即使它不包含pattern

資源:

Freeman Eric和Freeman Elisabeth以及Sierra Kathy和Bates Bert(2004)。 頭先設計模式 。 美利堅合眾國:O'Reilly Media,Inc.

參考:來自Java和ME博客的JCG合作伙伴 Alexis Lopez的Iterator Pattern和Java 。

翻譯自: https://www.javacodegeeks.com/2013/01/iterator-pattern-and-java.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/369991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/369991.shtml
英文地址,請注明出處:http://en.pswp.cn/news/369991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

不使用JavaScript實現菜單的打開和關閉

我在寫有菜單欄的網頁時,基本都會用響應式設計來適配移動端,例如把不重要的菜單選項隱藏,或者創建一個菜單按鈕來控制的菜單的打開和關閉之類的。而我之前一直是使用JavaScript來實現菜單的打開和關閉的,但最近在網上看到有人使用…

負載均衡的幾種方式

(1)HTTP重定向負載均衡。 這種負載均衡方案的優點是比較簡單,缺點是瀏覽器需要每次請求兩次服務器才能拿完成一次訪問,性能較差。(2)DNS域名解析負載均衡。 DNS域名解析負載均衡的優點是將負載均衡工作交給…

芝枝.計算機與人文科學,計算機與人文科學

計算機與人文科學(2013-03-13 13:24:17)標簽:文化戰爭名著《靜靜的頓河》可以說從它誕生起便沒有平靜過,圍繞它的作者所引起的爭議,就像它獲得諾貝爾文學獎一樣,撼動文壇,有人指控肖洛霍夫是個騙子,《靜靜的…

rto初始化和計算_TCP系列13—重傳—3、協議中RTO計算和RTO定時器維護

從上一篇示例中我們可以看到在TCP中有一個重要的過程就是決定何時進行超時重傳,也就是RTO的計算更新。由于網絡狀況可能會受到路由變化、網絡負載等因素的影響,因此RTO也必須跟隨網絡狀況動態更新。如果TCP過早重傳,則可能會向網絡中注入很多…

在Java 8 Lambda上使用Apache Commons Functor功能接口

Apache Commons Functor (以下稱為[functor])是一個Apache Commons組件,它提供功能性的編程API和已實現的幾種模式(訪問者,生成器,聚合器等)。 Java 8具有幾個不錯的新功能,包括lamb…

HTML5 Canvas游戲開發實戰 PDF掃描版

HTML5 Canvas游戲開發實戰主要講解使用HTML5 Canvas來開發和設計各類常見游戲的思路和技巧,在介紹HTML5 Canvas相關特性的同時,還通過游戲開發實例深入剖析了其內在原理,讓讀者不僅知其然,而且知其所以然。在本書中,除…

多線程之創建線程

在Java中,線程能區分兩種不同類型的線程:前臺線程和后臺線程。這兩者的區別就是:應用程序必須運行完所有的前臺線程才可以退出;而對于后臺線程,應用程序則可以不考慮其是否已經運行完畢而直接退出,所有的后…

阿 Q 的停車場

問題描述 剛拿到駕照的 KJ 總喜歡開著車到處兜風,玩完了再把車停到阿 Q 的停車場里,雖然 她對自己停車的水平很有信心,但她還是不放心其他人的停車水平,尤其是 Kelukin。于是, 她每次都把自己的愛車停在距離其它車最遠…

css3圖片垂直居中

圖片相對父元素垂直居中, css3屬性給父級元素設置 display: -webkit-box; -moz-box-align: center; -webkit-box-align: center; -moz-box-pack: center; -webkit-box-pack: center; 需要注意的是: 父級元素要有確定的高度!

聲明式的理解【gpt】

一 MyBatis采用了聲明式語法來進行SQL映射配置【mybatis聲明式】 MyBatis是一款優秀的持久層框架,支持自定義SQL、存儲過程以及高級映射,使得開發人員能夠專注于SQL本身而不是數據庫訪問。MyBatis提供了兩種配置方式:XML配置和注解配置&…

網絡局域網看不到其它計算機,局域網中看不到其它計算機怎么辦

通過網上鄰居或查看網絡計算機時,看不到局域網中其它計算機,這是怎么回事呢?下面是學習啦小編給大家整理的一些有關看不到局域網中其它計算機的解決方法,希望對大家有幫助!局域網中看不到其它計算機的解決方法打開“控制面板”-“網絡和Inte…

iconfont 圖標轉為字體_iconfont字體圖標的使用方法--超簡單!

我之前因為項目用bootstrap比較多,所以使用font awesome字體圖標比較多,后來接觸到了iconfont,發現想要的什么圖標都有,還可以自定義圖標,非常強大!之前看了一波教程,覺得繁瑣,自己弄明白后感覺如此簡單,做了這么個簡單教程,直接上圖,簡單粗暴,避免新手走彎路,這里講解的默認是…

一罐來統治所有人

跳下內存通道 早在1998年,當我是一名C / C 開發人員時,嘗試使用Java時,有關該語言的一些內容對我來說就顯得有些惱火了。 我記得很擔心這些 為什么沒有合適的編輯器呢? C / C 有很多。 我為Java擁有的只是舊的記事本。 當我想要…

Django集合Ueditor

語言版本環境:python3.6 1、win安裝步驟: 1 git下載源碼https://github.com/zhangfisher/DjangoUeditor 2 解壓DjangoUeditor3-master.tar 3 cd C:\Users\fj\Desktop\DjangoUeditor3-master 4 python setup.py install 官方建議使用pip install Djang…

計算機二級高級應用考題,2016計算機二級MSOFFICE高級應用考試真題

2016計算機二級MSOFFICE高級應用考試真題離2016上半年的計算機等級考試只有一個多月了,為了幫助大家盡快考試過關,小編整理了計算機二級office考試題,希望能幫助到大家!(1)下列敘述中正確的是A)一個算法的空間復雜度大,則其時間復…

ANTLR –語義謂詞

用antlr解析簡單的語法很簡單 。 您要做的就是使用正則表達式描述您的語言,并讓antlr生成詞法分析器和解析器。 解析大型或復雜的語言有時會需要更多,因為僅使用正則表達式描述它們是困難的,甚至是不可能的。 語義謂詞是在語法內部編寫的Jav…

python輸入一個數組輸出24進制式的時間_4.4 用于數組的文件輸入輸出 線性代數...

Numpy能夠讀寫磁盤上的文本數據或二進制數據。這一小節只討論Numpy的內置二進制格式,因為更多的用戶會使用pandas或其它工具加載文本或表格數據(見第6章)。np.save和np.load是讀寫磁盤數組數據的兩個主要函數。默認情況下,數組是以未壓縮的原始二進制格式…

DBMS-數據庫設計與E-R模型:E-R模型、約束、E-R圖、E-R擴展特性、E-R圖轉換為關系模式、UML建模...

設計過程概覽 1. 設計階段 最初階段:刻畫未來數據庫用戶的數據需求,產品為用戶需求規格說明; 概念設計階段(conceptual-design phase):(關注描述抽象數據及其聯系,通常使用實體-聯系…

tooltip.css-2.0文檔

tooltip.css 純CSS鼠標提示工具。 v. 2.0.0 更新日期&#xff1a;2018.4.12 預覽DEMO。 安裝&#xff1a; 只需在頁面中引入"tooltip.css"或“tooltip.min.css”文件即可。 如&#xff1a; <link rel"stylesheet" href"css/tooltip.css"…

Java虛擬機:如何判定哪些對象可回收?

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請注明出處&#xff0c;歡迎交流學習&#xff01; 在堆內存中存放著Java程序中幾乎所有的對象實例&#xff0c;堆內存的容量是有限的&#xff0c;Java虛擬機會對堆內存進行管理&#xff0c;回收已經“死去”的對象&…