Java編程之迭代器模式(Iterator Pattern)

引言:

走進圖書館,你站在一排書架前,想要瀏覽書籍。你會一格格地從左到右翻閱書籍,而不是去研究書架是什么。
一本書一本書地翻,才知道書架上藏了什么書,研究書架的構造是不知道書籍的內容的。
這種“逐本訪問,但不關心內部結構”的方式,正是迭代器模式所解決的問題。

一、什么是迭代器模式

迭代器模式(Iterator Pattern)是一種行為型設計模式,它用于順序訪問一個聚合對象(如集合、數組、列表等)中的元素,而不暴露其內部實現結構。

如同在圖書館看書,你只需一格一格地取書,不必關心書架內部是怎么存放書的。

二、模式結構與角色分工

我們以 Java 中模擬的“書架 BookShelf”為例,來理解迭代器模式的標準結構:

結構角色:

角色作用說明
Iterator定義遍歷行為接口,如 hasNext()next()
ConcreteIterator實現具體的遍歷邏輯
Aggregate表示可被遍歷的聚合容器
ConcreteAggregate實現具體容器,如 BookShelf
Client客戶端,使用迭代器來遍歷聚合對象

三、UML 類圖(PlantUML)

如下為UML結構圖:

在這里插入圖片描述

四、完整 Java 示例:

實現一個支持迭代的“書架”,來實現書架與書的迭代器。

定義迭代器接口

public interface Iterator<T> {boolean hasNext();T next();
}

定義聚合接口

public interface Aggregate<T> {Iterator<T> createIterator();
}

實體類:書 Book

public class Book {private final String name;public Book(String name) {this.name = name;}public String getName() {return name;}
}

聚合類:書架 BookShelf

public class BookShelf implements Aggregate<Book> {private final Book[] books;private int last = 0;public BookShelf(int maxSize) {books = new Book[maxSize];}public void appendBook(Book book) {books[last++] = book;}public Book getBookAt(int index) {return books[index];}public int getLength() {return last;}@Overridepublic Iterator<Book> createIterator() {return new BookShelfIterator(this);}
}

具體迭代器:BookShelfIterator

public class BookShelfIterator implements Iterator<Book> {private final BookShelf bookShelf;private int index = 0;public BookShelfIterator(BookShelf bookShelf) {this.bookShelf = bookShelf;}@Overridepublic boolean hasNext() {return index < bookShelf.getLength();}@Overridepublic Book next() {return bookShelf.getBookAt(index++);}
}

客戶端使用示例

public class Main {public static void main(String[] args) {BookShelf shelf = new BookShelf(5);shelf.appendBook(new Book("Java 入門"));shelf.appendBook(new Book("設計模式"));shelf.appendBook(new Book("數據結構"));Iterator<Book> iterator = shelf.createIterator();while (iterator.hasNext()) {System.out.println(iterator.next().getName());}}
}

五、優點與適用場景

優點

迭代器模式的 5 大優勢

優點點名詳細說明
封裝遍歷邏輯遍歷算法被封裝在 Iterator 中,不暴露集合內部結構(如數組、鏈表),提高封裝性和模塊化。
統一遍歷接口客戶端代碼只需依賴統一的 hasNext() + next() 接口,遍歷不同類型集合(數組、列表、集合)方式一致,降低學習和使用成本。
解耦數據與操作將“存儲數據”與“遍歷行為”解耦,使集合可以專注于數據存儲,迭代器專注于遍歷策略。可獨立擴展遍歷方式,而不破壞集合類結構。
支持多種遍歷策略可以擴展出不同的迭代器實現,如:
正向遍歷
反向遍歷
跳步遍歷(隔一個取一個)
過濾遍歷(如只遍歷奇數)
組合結構遍歷利器在樹形結構、圖結構、目錄結構(如菜單、文件系統)中,也能借助迭代器實現統一的訪問方式,特別適合組合模式聯合使用。

適用場景詳解

應用情境舉例說明
不想暴露集合內部結構比如使用數組或鏈表實現的容器,客戶端不應訪問 books[i]nextNode,而只應通過迭代器獲取元素。
希望集合類與遍歷邏輯解耦當你需要根據數據源切換不同存儲實現時(比如數組 ? 鏈表 ? 棧),客戶端代碼不應受影響,只需提供新的迭代器實現。
有多種遍歷需求時如:分頁展示(一次顯示10條)、篩選遍歷(只顯示評分大于4的書)、逆序瀏覽等。
需要統一接口處理不同容器你希望能一套邏輯遍歷多個不同集合對象(如 List、Set、自定義容器),通過統一接口提高代碼復用性。
希望組合結構對象支持遍歷在文件目錄、組織架構樹、菜單欄中,想要統一地“層層展開瀏覽”,迭代器是組合模式的理想搭檔。
開發腳本解釋器、編譯器語言處理器中常常要遍歷語法樹(AST),語法元素集合可以通過迭代器統一訪問,提高程序可擴展性。

六、在JDK 的使用

Java 中的 java.util.Iterator 就是這個模式的原生體現:

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");Iterator<String> it = list.iterator();
while (it.hasNext()) {System.out.println(it.next());
}

只需要關注 元素如何一個個訪問,而不關心其他因素。

總結

項目內容
模式名稱迭代器模式(Iterator Pattern)
類型行為型模式
典型用途遍歷集合,不暴露內部結構
Java 支持java.util.Iterator 接口
類比說明一本本地翻閱圖書館書架上的書

參考

《23種設計模式概覽》
在這里插入圖片描述

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

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

相關文章

ARM64 linux系統的一般執行過程

1、正在運行的用戶進程X 2、發生異常&#xff08;包括系統調用等&#xff09;&#xff0c;CPU完成的工作&#xff1a;把當前程序指針寄存器PC放入ELR_EL1寄存器&#xff0c;把PSTATE放入SPSR_EL1寄存器&#xff0c;把異常產生的原因放在ESR_EL1寄存器&#xff0c;將異常向量表…

Vue3+ element 實現導入導出

一、導入功能相關代碼分析 相關變量定義 importVisible&#xff1a;這是一個ref類型的響應式變量&#xff0c;用于控制導入對話框的顯示與隱藏&#xff0c;初始值為false。當用戶點擊 “導入” 按鈕時&#xff0c;會嘗試將其值設為true來顯示導入對話框&#xff0c;若出現異常則…

Git安裝(純小白版)

一、Git安裝 1. 簡介 Git是一款免費開源的分布式版本控制系統&#xff0c;常用于軟件開發。它能記錄文件在不同時間的改動&#xff0c;讓用戶在需要時查看、恢復舊版本。支持多人協作開發&#xff0c;多人可同時修改項目文件&#xff0c;Git會處理好沖突。開發者能在本地創建…

cocos2 本地根據文本內容生成二維碼

cocos2 本地根據文本內容生成二維碼 之前做了一個功能&#xff0c;就是cocos2小游戲&#xff0c;結算頁面需要有一個二維碼&#xff0c;二維碼內容是一個網址&#xff0c;這個網址需要根據用戶游玩分數確定訪問哪個網址&#xff0c;但是這個小游戲是單機小游戲&#xff0c;不連…

87.xilinx FPGA讀取器件id方法

dout數據高位先出msb module chip_id_reader(input clk,input reset,output [56:0] dna_value,output dna_valid );reg [6:0] bit_count;reg [56:0] dna_shift_reg;reg dna_read;reg dna_shift;wire dna_out;// 實例化DNA_PORT原語DNA_PORT #(.SIM_DNA_VALUE(57h123456789ABCD…

AcWing--數據結構(二)

Trie 樹 用來高效的快速存儲和查找字符串集合的數據結構 如存儲&#xff1a;abcdef,abdef,aced,... 從根節點開始存儲&#xff0c;從前往后存儲&#xff0c;看是否有a&#xff0c;沒有就創建&#xff0c;依次存儲。 一般在最后一個字符打個標記&#xff0c;意思就是當前字符…

論基于架構的軟件設計方法(ABSD)及應用

2025年3月22日作 題目 基于架構的軟件設計&#xff08;Architecture-Based Software Design, ABSD&#xff09;方法以構成軟件架構的商業、質量和功能需求等要素來驅動整個軟件開發過程。ABSD是一個自頂向下&#xff0c;遞歸細化的軟件開發方法&#xff0c;它以軟件系統功能的…

【Docker基礎】Docker容器管理:docker exec詳解

目錄 1 docker exec命令概述 1.1 命令定位與作用 1.2 與相似命令對比 2 基本語法與參數解析 2.1 完整命令語法 2.2 核心參數詳解 2.2.1 -i, --interactive 2.2.2 -t, --tty 2.2.3 -d, --detach 2.2.4 -e, --env 2.2.5 -u, --user 2.2.6 -w, --workdir 3 典型使用場…

CSS3實現同心圓效果

效果圖&#xff1a; 文本左側顯示一個 外圓&#xff08;30px&#xff0c;半透明&#xff09; 和 內圓&#xff08;12px&#xff0c;實色&#xff09; 的同心圓&#xff1a; <!DOCTYPE html> <html> <head><style>.text-with-circles {position: rela…

Spring Boot項目開發實戰銷售管理系統——系統設計!

Spring Boot項目開發實戰——銷售管理系統 在前面的章節中我們詳細介紹了Spring Boot各個功能的使用&#xff0c;本章將新建一個銷售管理系統項目&#xff0c;演示項目從需求分析到功能分解&#xff0c;再到各個功能的實現過程&#xff0c;最后再使用Docker部署上線的完整過程…

RK3588開發筆記-Hailo AI模塊調試

目錄 前言 一、RK3588 與 Hailo AI 模塊簡介 RK3588 Hailo AI 模塊 二、原理圖連接 三、內核配置 四、Hailo驅動編譯 五、Hailo模塊驗證 總結 前言 在邊緣計算和人工智能應用不斷發展的今天,將高性能的 AI 模塊與功能強大的開發板相結合,能為各種創新應用提供堅實的基…

【Pytorch】語言模型上的動態量化

目錄 ■導言 ①定義模型 ②加載文本數據 ③加載預訓練模型 ④測試動態量化 ■結論 ■導言 量化涉及將模型的權重和激活從float轉換為int&#xff0c;這可以導致更小的模型大小和更快的推理&#xff0c;并且只對準確性造成很小的影響。 本文將把最簡單的量化形式-動態量…

【有啥問啥】大模型效率部署之Prefill-Decode分離

大模型效率部署之Prefill-Decode分離 Prefill 與 Decode 階段定義與流程 LLM 推理分為兩個階段&#xff1a;預填充&#xff08;Prefill&#xff09;和解碼&#xff08;Decode&#xff09;。在 Prefill 階段&#xff0c;模型將完整地處理用戶輸入的所有提示詞&#xff08;prom…

QT Creator構建失敗:-1: error: Unknown module(s) in QT: serialport

Qt Creator和Qt SDK版本&#xff1a; Product: Qt Creator 17.0.0 Based on: Qt 6.9.1 (MSVC 2022, x86_64) Built on: Jun 17 2025 16:32:24 From revision: 4983f08c47 問題&#xff1a; 在使用串口的時候&#xff0c;在pro 文件中添加了 QT serialport&#xff…

基于PostgreSQL的百度或高德等POI多層級分類的數據庫設計

目錄 前言 一、百度 VS 高德 POI分類 1、高德POI分類 2、百度POI分類 3、分類對比與區別 二、POI分類表設計 1、物理表結構 2、數據存儲 3、數據查詢 三、總結 前言 在當今數字化快速發展的時代&#xff0c;地理信息數據的重要性日益凸顯&#xff0c;而POI&#xff08…

AutoVLA:端到端自動駕駛中具有自適應推理和強化微調功能的視覺-語言-動作模型

26年6月來自UCLA的論文“AutoVLA: A Vision-Language-Action Model for End-to-End Autonomous Driving with Adaptive Reasoning and Reinforcement Fine-Tuning”。 視覺-語言-動作 (VLA) 模型的最新進展通過利用世界知識和推理能力為端到端自動駕駛帶來了希望。然而&#x…

知攻善防靶機 Windows 近源OS

知攻善防靶機 [hvv訓練]應急響應靶機訓練-近源滲透OS-1 前景需要&#xff1a;小王從某安全大廠被優化掉后&#xff0c;來到了某私立小學當起了計算機老師。某一天上課的時候&#xff0c;發現鼠標在自己動彈&#xff0c;又發現除了某臺電腦&#xff0c;其他電腦連不上網絡。感覺…

「Java基本語法」求三位整數的各位數字之和

引言 現在來玩一個數字拆解游戲。想象一下手里拿著一個三位數的積木,現在需要把它拆成個位、十位和百位三塊,然后把它們加起來。這個操作在實際編程中很常見,例如做密碼校驗、游戲分數計算等都可能會用到。 案例:求三位數各位之和 編寫程序,從鍵盤輸入一個三位的正整數…

SciChart 助力蛋白質結構研究:實時可視化推動生物科學新突破

SciChart是高性能數據可視化領域的優秀圖表產品&#xff0c;深受數據密度和精度至關重要行業的信賴&#xff0c;包括航空航天、石油和天然氣、科學研究和賽車運動等。作為F1中使用的解決方案&#xff0c;SciChart被NASA所依賴&#xff0c;并受到90%的頂級醫療技術公司青睞&…

基于Docker與cpolar的Leantime部署方案實現低成本跨地域團隊協作

文章目錄 前言1.關于Leantime2.本地部署Leantime3.Leantime簡單實用4.安裝內網穿透5.配置Leantime公網地址6. 配置固定公網地址 前言 各位小伙伴們&#xff0c;讓我們暫時把目光從云端的分布式系統轉向本地環境。在您的Linux主機上&#xff0c;我們將搭建一個高性價比的協作平…