迭代器模式 (Iterator Pattern)

定義

迭代器模式(Iterator Pattern)是一種行為型設計模式,用于順序訪問集合對象的元素,而無需知道集合對象的底層表示。迭代器模式將遍歷集合的責任從集合對象轉移到迭代器對象上,這簡化了集合接口和實現,同時也使得遍歷不同的集合類型統一和標準化。

迭代器模式主要涉及以下角色:

  • 迭代器(Iterator)接口:定義訪問和遍歷元素的接口。
  • 具體迭代器(Concrete Iterator):實現迭代器接口,并負責遍歷集合的具體對象。
  • 集合(Aggregate)接口:定義創建迭代器對象的接口。
  • 具體集合(Concrete Aggregate):實現創建迭代器對象的接口,返回一個適合該集合的具體迭代器實例。
  • 客戶端(Client):使用迭代器接口訪問集合元素。
解決的問題
  • 統一的遍歷方式:提供一種統一的方法來遍歷各種類型的集合對象,而不暴露其內部結構。
  • 解耦集合對象和遍歷邏輯:將集合的遍歷邏輯從集合對象中分離出來,使得集合對象和遍歷邏輯之間的職責更加清晰。
  • 支持多種遍歷:可以定義多種遍歷方式,每種方式對應一個迭代器實現。
使用場景
  • 不同的方式遍歷集合:當集合對象需要提供多種遍歷方式時,迭代器模式提供了一種靈活的解決方案。
  • 訪問集合的內容而無需暴露其內部結構:當需要提供一種標準的方式來遍歷集合,而又不希望暴露集合的內部表示時。
  • 允許在不同的集合類型上進行遍歷:迭代器模式可以在不同類型的集合對象上實現統一的遍歷接口。
示例代碼
// 迭代器接口
public interface Iterator {boolean hasNext();Object next();
}// 集合接口
public interface Container {Iterator getIterator();
}// 具體集合實現
class NameRepository implements Container {public String names[] = {"Robert", "John", "Julie", "Lora"};@Overridepublic Iterator getIterator() {return new NameIterator();}// 內部類實現具體迭代器private class NameIterator implements Iterator {int index;@Overridepublic boolean hasNext() {return index < names.length;}@Overridepublic Object next() {if (this.hasNext()) {return names[index++];}return null;}}
}// 客戶端使用迭代器
public class IteratorPatternDemo {public static void main(String[] args) {NameRepository namesRepository = new NameRepository();for (Iterator iter = namesRepository.getIterator(); iter.hasNext();) {String name = (String)iter.next();System.out.println("Name : " + name);}}
}
主要符合的設計原則
  • 單一職責原則(Single Responsibility Principle)
    • 迭代器模式將數據的遍歷和業務邏輯分離。容器只負責管理元素,而迭代器負責遍歷這些元素。這種分離確保了每個類都只有一個改變的原因,迭代器負責遍歷邏輯,而容器類負責管理集合。
  • 開閉原則(Open-Closed Principle)
    • 該模式允許在不修改現有集合對象的情況下引入新的迭代器類型。例如,你可以引入一個新的迭代器來遍歷容器中的元素,而無需修改容器類的代碼。因此,容器類對擴展是開放的,但對修改是封閉的。
  • 迪米特法則(Law of Demeter)或最少知識原則
    • 迭代器模式允許客戶端代碼僅與迭代器對象交互,而不需要直接處理集合內部的細節。這符合迪米特法則,即一個對象應該盡量少地了解其他對象。
  • 里氏替換原則(Liskov Substitution Principle)
    • 如果迭代器有一個基類或接口,那么其不同的實現(例如前向迭代器、后向迭代器或隨機訪問迭代器)可以互換使用,而不影響客戶端代碼的運行。這符合里氏替換原則,因為子類迭代器可以替換基類迭代器。
在JDK中的應用
  • Java Collections Framework
    • 幾乎所有的集合類(如 ArrayList, HashSet, LinkedList 等)都通過 Iterator 接口提供了迭代器。這些集合類的 iterator() 方法返回一個實現了 Iterator 接口的對象,用于遍歷集合中的元素。
  • java.util.Iterator
    • 這是迭代器模式的核心接口。它定義了 next(), hasNext(), 和 remove() 等方法,用于遍歷集合并在必要時刪除元素。
  • java.util.ListIterator
    • ListIteratorIterator 接口的擴展,專門用于列表的雙向遍歷。除了標準的迭代器操作外,它還支持向前遍歷、修改元素和獲取元素的索引。
  • java.util.Enumeration
    • 雖然現在已經不常用,Enumeration 是早期Java版本中的一種迭代器,用于遍歷例如 VectorHashtable 這樣的數據結構。
  • java.util.Scanner
    • Scanner 類在某種程度上也實現了迭代器模式。它可以對輸入進行解析,并以迭代的方式返回輸入的各個部分(如通過 next() 方法)。
  • java.nio.file.DirectoryStream
    • 在NIO文件系統中,DirectoryStream 接口用于遍歷目錄中的文件。它提供了一個迭代器來訪問目錄中的每個文件。
在Spring中的應用
  • Spring的資源處理
    • Spring提供了對資源的抽象,比如 Resource 接口和 ResourceLoader。在處理資源集合時,比如從一個目錄加載所有配置文件,Spring可能內部使用迭代器模式來遍歷這些資源。
  • Bean的后處理器
    • 在Spring的應用上下文中,可能會有多個 BeanPostProcessor 實例。在初始化bean的過程中,Spring容器會遍歷這些后處理器,并對bean應用它們。這種遍歷的邏輯類似于迭代器模式。
  • 數據訪問模塊
    • 在Spring的數據訪問模塊,如JDBC或JPA集成中,處理查詢結果集時可能會隱式使用迭代器模式。例如,JdbcTemplate 可能使用迭代器來遍歷 ResultSet
  • Spring Batch
    • 在Spring Batch框架中,對于批量數據處理,迭代器模式可能被用于逐條處理大量記錄。

雖然這些例子并非迭代器模式的直接實現,但它們在設計上采用了迭代器模式的核心思想——通過迭代器來抽象和簡化對集合或序列的訪問。這種設計使得Spring的各個組件能夠以統一和靈活的方式處理集合和序列數據,同時保持了代碼的清晰性和可維護性。


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

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

相關文章

計算機應用基礎_錯題集_基礎知識---網絡教育統考工作筆記006

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、基礎知識部分錯題集總結前言 計算機應用基礎統考,錯題集總結 一、基礎知識部分 基礎知識部分 2、微處理器芯片的位數即指______。 A.速度 B.字長 C.

Unity Android FireBase bugly報錯查詢

報錯如下圖&#xff0c;注意&#xff0c;標紅的三處 使用的il2cpp和架構是arm64-v8a 那我們就可以根據這些去找對應的符號表&#xff0c;在unity安裝目錄下 Unity2020.3.33f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Symbols\arm64-v8a 找到l…

Tomcat注冊為服務后,如何配置Tomcat內存大小

前提條件&#xff1a;tomcat已經注冊為服務。 1.winR,輸入regedit打開注冊表 2.找到Tomcat注冊表路徑&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat80603.找到jvm內存配置路徑&#xff1a; HKEY_LOCAL_MACHINE\SOFTW…

PTA-6-312 使用多態實現圖書館計算罰金功能

題目&#xff1a; 圖書館提供給讀者借閱服務&#xff0c;包括借閱書籍及音像制品。如果借閱超時需要繳納罰金。對于不同類型的書籍和音像制品罰款規則不同。 成人書籍:允許借閱的時間是21天&#xff0c;每超時1天&#xff0c;需要繳納罰金2元;如果超時3天以上&#xff0c;超出的…

vue中 mixin用法

在Vue.js中&#xff0c;mixin是一種可以在多個組件之間共享Vue組件選項的靈活方式。mixin對象可以包含任何組件選項。當組件使用mixin時&#xff0c;所有mixin對象的選項將被“混合”到該組件的選項中。 使用mixin的一個主要優點是可以在多個組件之間重用和共享代碼。這可以幫…

SSM大學生社團信息管理系統-99953,(免費領取源碼)計算機畢業設計選題開題+程序定制+論文書寫+答辯ppt書寫 包售后 全流程

SSM大學生社團信息管理系統APP 摘 要 隨著科學技術的飛速發展&#xff0c;社會的方方面面、各行各業都在努力與現代的先進技術接軌&#xff0c;通過科技手段來提高自身的優勢&#xff0c;高校當然也不能排除在外。大學生社團信息管理系統APP是以實際運用為開發背景&#xff0c…

CMake中常見的預定義變量

文章目錄 CMake常見的預定義變量CMake variables官方文檔 CMake常見的預定義變量 在 CMake 中&#xff0c;有一些常見的預定義變量&#xff0c;它們提供了有關項目、目錄結構和構建環境的信息。這些變量可用于設置路徑、傳遞參數、以及進行其他與構建過程相關的操作。 以下是…

Rust語言入門教程(五) - 流控制語句

if 表達式 在Rust中&#xff0c; if語句的判斷條件不需要用( )括起來&#xff0c; 它會認為所有在if 和 {之間的表達式就是判斷條件&#xff0c;例如&#xff1a; if num 5 {msg "five"; }判斷條件的表達式必須返回一個bool型的值&#xff0c; 因為Rust是一個不喜…

[C/C++]數據結構 循環隊列

前言: 隊列是一種具有先進先出特性的結構,但是當數據出隊列以后,前面的空間就無法再次利用了,循環隊列就可以解決這個問題 一:概念及結構: 1.循環隊列概念 循環隊列是一種線性數據結構&#xff0c;其操作表現基于 FIFO&#xff08;先進先出&#xff09;原則并且隊尾被連接在隊…

顛覆與創新:算法備案的雙重挑戰

隨著數字時代的迅猛發展&#xff0c;算法已經成為了企業創新和競爭的關鍵因素。然而&#xff0c;伴隨著算法的廣泛應用&#xff0c;數據隱私、法規合規等問題也愈發凸顯&#xff0c;給企業帶來了雙重挑戰。本文將深入探討這一話題&#xff0c;探討算法備案如何在顛覆與創新之間…

IDEA、PHPSTORM 在命令行中進行 PHP debug

然在終端執行控制器的方法php yii test/ab 即可看到觸發debug 調試

視頻剪輯技巧:多個視頻合并新篇章,高效視頻剪輯,創造無限可能

在數字媒體時代&#xff0c;視頻剪輯已經成為一項重要的技能。多個視頻合并是一種將多個視頻片段合并成一個完整視頻的技巧。這種技巧可以將不同的視頻片段組合在一起&#xff0c;制作出獨特且具有吸引力的視頻內容。現在一起操作下云炫AI智剪如何批量合并視頻的操作吧。 一、準…

友思特分享 | Neuro-T:零代碼自動深度學習訓練平臺

來源&#xff1a;友思特 智能感知 友思特分享 | Neuro-T&#xff1a;零代碼自動深度學習訓練平臺 歡迎關注虹科&#xff0c;為您提供最新資訊&#xff01; 工業自動化、智能化浪潮涌進&#xff0c;視覺技術在其中扮演了至關重要的角色。在汽車、制造業、醫藥、芯片、食品等行業…

針對CSP-J/S的每日一練:Day 11

一、審題 題目描述 給定兩個大小分別為 m m m 和 n n n 的正序&#xff08;從小到大&#xff09;數組 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2。請你找出并返回這兩個正序數組的中位數。 算法的時間復雜度應該為 O ( l o g ( m n ) ) O(log (mn)) O(log(mn)) 。…

初學vue3與ts:路由跳轉帶參數

index-router <!-- 路由跳轉 --> <template><div><div class"title-sub flex"><div>1、用router-link跳轉帶參數id1&#xff1a;</div><router-link to"./link?id1"><button>點我跳轉</button>&…

maven 將Jar包安裝到本地倉庫

window系統&#xff1a; 注意事項&#xff1a;在windows中&#xff0c;使用mvn指令將jar安裝到本地倉庫時&#xff0c;一定要將相關資源使用“"”包裹上&#xff0c;不然會報下面的錯&#xff1a; mvn install:install-file "-DfileD:\BaiduNetdiskDownload\qianzixi…

管道在Vue和Angular中的作用及React的替代方案

管道在Vue和Angular中的作用及React的替代方案 前言管道起源管道特點 前端中管道概念和作用概念作用 React關于管道的替代方案Vue和Angular管道的區別 前言 本文主要講解管道在Vue和Angular中有哪些作用以及React對于管道概念的替代方案是什么。 管道起源 計算機中的Pipline…

PHP5.3 + Apache2.2 + Xdebug2.1.2環境并集成至PHPStrom全流程(解決使用最好的語言前的痛點問題)

文章目錄 問題背景安裝流程PHP安裝配置PHPApache安裝及配置PHPStrom集成PHP環境進行PHP開發 問題背景 由于公司陳舊項目的重新啟動&#xff0c;現需要對該項目開發微信登錄模塊&#xff0c;本人是寫 Java 的&#xff0c;但本著程序員終身學習、不懼新事物的特點&#xff0c;現…

NX二次開發UF_CSYS_set_wcs_display 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_set_wcs_display Defined in: uf_csys.h int UF_CSYS_set_wcs_display(int display_status ) overview 概述 Set display of work coordinate system. 展示工作坐標系。 …

Android 11.0 默認開啟USB調試功能

Android 11.0 默認開啟USB調試功能 近來收到項目反饋需求想要默認開啟USB調試功能&#xff0c;默認開啟USB調試功能主要是在UsbDebuggingActivity.java文件中實現&#xff0c;具體修改參照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/and…