迭代器模式深度解析與實戰案例

一、模式定義

迭代器模式(Iterator Pattern) 是一種行為設計模式,提供一種方法順序訪問聚合對象的元素,無需暴露其底層表示。核心思想是將遍歷邏輯從聚合對象中分離,實現 遍歷與存儲的解耦。

二、核心組件

組件作用
Iterator定義遍歷接口(hasNext/next)
ConcreteIterator實現具體集合的遍歷邏輯
Aggregate聚合對象接口,定義創建迭代器的方法
ConcreteAggregate具體聚合對象,實現迭代器創建方法

三、模式優勢

統一遍歷接口:不同集合使用相同方式遍歷
單一職責原則:分離集合管理與遍歷算法
開閉原則:新增迭代器類型不影響現有代碼
并行遍歷:支持多個迭代器同時遍歷集合

四、真實場景案例:社交網絡關系遍歷

場景需求
某社交平臺需要實現:
用戶關系包含 好友列表(數組存儲)和 關注列表(鏈表存儲)
需要統一接口遍歷兩種關系
支持 隱私過濾(不展示已注銷用戶)

五、Java實現代碼

1. 迭代器接口

public interface RelationIterator<T> {boolean hasNext();T next();void remove();
}

2. 聚合對象接口

public interface SocialNetwork {RelationIterator<User> createIterator();RelationIterator<User> createActiveUserIterator(); // 擴展:過濾非活躍用戶
}

3. 具體聚合對象實現

// 好友列表(數組存儲)
class FriendList implements SocialNetwork {private User[] friends;private int size;public FriendList(int capacity) {friends = new User[capacity];}public void addFriend(User user) {if (size < friends.length) {friends[size++] = user;}}@Overridepublic RelationIterator<User> createIterator() {return new FriendListIterator();}@Overridepublic RelationIterator<User> createActiveUserIterator() {return new ActiveFriendListIterator();}// 具體迭代器實現(內部類)private class FriendListIterator implements RelationIterator<User> {private int position = 0;@Overridepublic boolean hasNext() {return position < size;}@Overridepublic User next() {if (!hasNext()) throw new NoSuchElementException();return friends[position++];}@Overridepublic void remove() {throw new UnsupportedOperationException();}}// 擴展:過濾非活躍用戶private class ActiveFriendListIterator implements RelationIterator<User> {private int position = 0;@Overridepublic boolean hasNext() {skipInactiveUsers();return position < size;}@Overridepublic User next() {if (!hasNext()) throw new NoSuchElementException();return friends[position++];}private void skipInactiveUsers() {while (position < size && !friends[position].isActive()) {position++;}}}
}// 關注列表(鏈表存儲)
class FollowingList implements SocialNetwork {private static class Node {User user;Node next;Node(User user) {this.user = user;}}private Node head;private Node tail;public void addFollowing(User user) {Node newNode = new Node(user);if (head == null) {head = tail = newNode;} else {tail.next = newNode;tail = newNode;}}@Overridepublic RelationIterator<User> createIterator() {return new FollowingListIterator();}// 具體迭代器實現(內部類)private class FollowingListIterator implements RelationIterator<User> {private Node current = head;@Overridepublic boolean hasNext() {return current != null;}@Overridepublic User next() {if (!hasNext()) throw new NoSuchElementException();User user = current.user;current = current.next;return user;}@Overridepublic void remove() {throw new UnsupportedOperationException();}}
}

4. 用戶實體類

public class User {private final String id;private String name;private boolean active = true;public User(String id, String name) {this.id = id;this.name = name;}// Getters/Setterspublic boolean isActive() { return active; }public void deactivate() { active = false; }
}

5. 客戶端使用

public class SocialNetworkClient {public static void main(String[] args) {// 初始化數據User user1 = new User("U001", "張三");User user2 = new User("U002", "李四");user2.deactivate();User user3 = new User("U003", "王五");// 構建好友列表FriendList friends = new FriendList(10);friends.addFriend(user1);friends.addFriend(user2);friends.addFriend(user3);// 構建關注列表FollowingList followings = new FollowingList();followings.addFollowing(user3);followings.addFollowing(user1);// 遍歷好友列表(基礎迭代器)System.out.println("=== 好友列表 ===");printRelations(friends.createIterator());// 遍歷關注列表System.out.println("\n=== 關注列表 ===");printRelations(followings.createIterator());// 使用過濾迭代器System.out.println("\n=== 活躍好友 ===");printRelations(friends.createActiveUserIterator());}private static void printRelations(RelationIterator<User> iterator) {while (iterator.hasNext()) {User user = iterator.next();System.out.printf("%s (%s)%n", user.getName(), user.isActive() ? "活躍" : "已注銷");}}
}

六、運行結果

=== 好友列表 ===
張三 (活躍)
李四 (已注銷)
王五 (活躍)=== 關注列表 ===
王五 (活躍)
張三 (活躍)=== 活躍好友 ===
張三 (活躍)
王五 (活躍)

七、模式變體與優化

1. 多維度迭代
// 組合條件迭代器
public interface CompositeIterator<T> extends RelationIterator<T> {void addFilter(Predicate<T> filter);void sort(Comparator<T> comparator);
}// 使用示例
CompositeIterator<User> iterator = new SmartUserIterator();
iterator.addFilter(User::isVIP);
iterator.sort(Comparator.comparing(User::getJoinDate));
2. 線程安全實現
// 快照迭代器(避免ConcurrentModificationException)
public class SnapshotIterator<T> implements RelationIterator<T> {private final List<T> snapshot;private int position = 0;public SnapshotIterator(Collection<T> original) {this.snapshot = new ArrayList<>(original);}// 實現標準迭代器方法...
}

八、行業應用場景

場景具體應用優勢體現
文件系統遍歷遞歸遍歷目錄結構統一處理文件/文件夾
數據庫查詢結果集游標遍歷處理海量數據內存優化
游戲物品系統背包不同分類物品遍歷支持多種篩選條件
大數據處理分片數據順序訪問處理超出內存限制的數據
GUI組件樹遍歷窗口組件層級遍歷支持深度優先/廣度優先策略

九、最佳實踐建議

迭代器生命周期管理
// 使用try-with-resources管理資源
try (RelationIterator<User> iterator = friends.createIterator()) {while (iterator.hasNext()) {// 處理邏輯}
}
空迭代器實現
// 空對象模式應用
public class EmptyIterator<T> implements RelationIterator<T> {@Override public boolean hasNext() { return false; }@Override public T next() { throw new NoSuchElementException(); }
}
性能優化技巧
// 預計算迭代路徑(適用于樹形結構)
public class PrecomputedTreeIterator<T> implements RelationIterator<T> {private final List<T> traversalPath;private int index = 0;public PrecomputedTreeIterator(TreeNode root) {this.traversalPath = preorderTraversal(root);}// 實現標準方法...
}

十、與相似模式對比

模式核心差異適用場景
迭代器專注集合遍歷機制需要統一遍歷接口的場景
訪問者在遍歷過程中執行操作對集合元素進行復雜操作
組合處理樹形結構需要遞歸遍歷的層級結構
工廠方法用于創建迭代器對象需要靈活創建不同類型迭代器

通過這個社交網絡關系遍歷的案例,可以看出迭代器模式如何 有效封裝不同數據結構的遍歷邏輯。在實際開發中,可根據需求擴展迭代器功能(如過濾、排序、分頁等),同時保持客戶端代碼的簡潔性。該模式特別適合需要支持多種數據存儲方式且需要統一訪問接口的系統架構。

一句話總結

迭代器模式是為了提供一種能順序遍歷對象的解決方案,該方案不對外暴露存儲細節。

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

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

相關文章

SSH遠程工具

一、常見SSH遠程工具 工具開源跨平臺多標簽文件傳輸高級功能價格Xshell?Win????腳本、會話管理免費/商業版Tabby??全平臺????插件擴展免費MobaXterm?Win????集成工具集免費/付費SecureCRT?Win/macOS/Linux????企業級加密$129+PuTTY??全平臺??基礎連接…

VUE中的路由處理

1.引入,預處理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由規…

編程助手fitten code使用說明(超詳細)(vscode)

這兩年 AI 發展迅猛&#xff0c;作為開發人員&#xff0c;我們總是追求更快、更高效的工作方式&#xff0c;AI 的出現可以說改變了很多人的編程方式。 AI 對我們來說就是一個可靠的編程助手&#xff0c;給我們提供了實時的建議和解決方&#xff0c;無論是快速修復錯誤、提升代…

Opencv計算機視覺編程攻略-第九節 描述和匹配興趣點

一般而言&#xff0c;如果一個物體在一幅圖像中被檢測到關鍵點&#xff0c;那么同一個物體在其他圖像中也會檢測到同一個關鍵點。圖像匹配是關鍵點的常用功能之一&#xff0c;它的作用包括關聯同一場景的兩幅圖像、檢測圖像中事物的發生地點等等。 1.局部模板匹配 憑單個像素就…

C++內存管理優化實戰:提升應用性能與效率

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發技術&#xff0c;能熟練應用常用數據庫SQL server,Oracle…

17-產品經理-創建發布

點擊“發布”-“創建發布”。 填寫發布名稱&#xff0c;選擇測試的版本。還可以設置此次發布是否為“里程碑”。 點擊“保存”后&#xff0c;進入該發布詳情頁面。需要為此次發布關聯需求、已解決BUG、以及遺留BUG。可以通過設置條件&#xff0c;進行“搜索”&#xff0c;然后批…

Axure RP9.0教程 | 內聯框架 對應html 元素中的iframe標簽 (打開內部頁面和外部網址)

文章目錄 引言I 打開內部頁面II 打開外部網址操作效果引言 應用場景: 選擇右側不同欄目,左側內容發生變化 I 打開內部頁面 在公用元件庫中找到內聯框架圖標,將其拖到畫布中,設置其寬、高;在右側添加三個按鈕,分別用來跳轉三個不同的頁面;在內部框架中,添加三個子頁面,…

在1panel中安裝WebUI

如果需要建站&#xff0c;那得選安裝Openresty。點擊應用商店&#xff0c;安裝 Openresty 接下來安裝Ollama&#xff0c;可以部署本地模型提供給WebUi平臺使用 最后是安裝 WebUi&#xff0c;安裝時需要填寫Ollama的地址: 容器地址&#xff1a;30000 這些安裝都很方便&#xf…

項目難點亮點

Vue項目 RBAC設計 用戶權限設置 WebSocket 消息處理 BPMN擴展 跨語言模型的調用 大片文件(影像,模型等,數據-模型集成) 組件&指令封裝 低代碼表單構建、BPMN編輯器集成與實現 通用參考點 若依(RuoYi)是一個基于 Vue.js 和 Spring Boot 的前后端分離權限管理系…

JVM生產環境調優實戰

案例三&#xff1a;JVM頻繁Full GC優化 1. 項目背景&#xff08;Situation&#xff09; 在云中萬維跨境支付的反洗錢系統中&#xff0c;我們負責對海量交易數據進行實時規則校驗&#xff0c;以確保符合監管要求。系統日均處理交易量超過500萬筆&#xff0c;峰值QPS達到3000&a…

ASP.NET Web 中進行 GET/POST 提交并接收返回數據的幾種方案

在 ASP.NET Web 應用程序中進行 GET 請求并接收返回數據可以通過多種方式實現&#xff0c;以下是幾種常見的方法&#xff1a; 1. 使用 WebClient 類&#xff08;簡單方式&#xff09; using System.Net; using System.IO;public string GetDataFromUrl(string url) {using (W…

Springboot--Kafka客戶端參數關鍵參數的調整方法

調整 Kafka 客戶端參數需結合生產者、消費者和 Broker 的配置&#xff0c;以實現性能優化、可靠性保障或資源限制。以下是關鍵參數的調整方法和注意事項&#xff1a; 一、生產者參數調整 ?max.request.size? ?作用?&#xff1a;限制單個請求的最大字節數&#xff08;包括消…

Android學習總結之service篇

引言 在 Android 開發里&#xff0c;Service 與 IntentService 是非常關鍵的組件&#xff0c;它們能夠讓應用在后臺開展長時間運行的操作。不過&#xff0c;很多開發者僅僅停留在使用這兩個組件的層面&#xff0c;對其內部的源碼實現了解甚少。本文將深入剖析 Service 和 Inte…

ExternalProject_Add 使用手冊與文檔詳解

一、基本概念與語法 ExternalProject_Add 是 CMake 的一個核心命令&#xff0c;用于在構建過程中集成和管理外部項目&#xff08;如第三方庫&#xff09;。它支持完整的生命周期管理&#xff0c;包括下載、配置、構建、安裝和測試。 語法&#xff1a; ExternalProject_Add(&l…

低延遲云網絡的核心技術

低延遲云網絡通過架構優化、協議創新、硬件加速等多維度技術手段,將數據傳輸延遲降低至毫秒級甚至微秒級。 1. 網絡架構優化 1.1 扁平化網絡Leaf-Spine 架構 減少網絡層級,縮短數據轉發路徑(如數據中心內部一跳可達)。 扁平化網絡Leaf-Spine(葉子-脊椎)架構是一種現代…

網絡安全法規與入門指南

在當今數字化時代&#xff0c;網絡安全已成為保障個人隱私、企業利益和國家安全的關鍵領域。隨著網絡攻擊的日益復雜和頻繁&#xff0c;了解和遵守網絡安全法規變得尤為重要。本文將深入探討網絡安全相關法規&#xff0c;并為想要進入這一領域的讀者提供實用的入門指南。 一、…

硬盤分區格式方案之 MBR(Master Boot Record)主引導記錄的 主分區 和 擴展分區 筆記250407

硬盤分區格式方案之 MBR&#xff08;Master Boot Record&#xff09;主引導記錄的 主分區 和 擴展分區 筆記250407 一、主分區&#xff08;Primary Partition&#xff09; 1. 定義與功能 直接引導操作系統&#xff1a;主分區是獨立的存儲單元&#xff0c;可直接安裝操作系統并…

【Proteus仿真】【32單片機-A007】PT100熱敏溫度檢測系統設計

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 聯系作者 一、主要功能 1、LCD1602顯示當前檢測的溫度值以及溫度閾值 2、超過上限溫度&#xff0c;降溫模塊啟動? 3、PT100熱敏電阻測量-60C-135C 4、按鍵設置溫度閾值 5、超過閾值&#xff0…

pyqt SQL Server 數據庫查詢-優化2

1、增加導出數據功能 2、增加刪除表里數據功能 import sys import pyodbc from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QLineEdit, QPushButton, \QTableWidget, QTableWidgetItem, QLabel, QMessageBox from PyQt6.QtGui i…

Github 熱點項目 ChartDB AI自動導表結構+遷移腳本,3分鐘生成專業數據庫關系圖

ChartDB堪稱數據庫設計神器&#xff01;亮點①&#xff1a;動動手指輸入SQL&#xff0c;秒出結構圖&#xff0c;表關系一目了然&#xff0c;團隊評審時再也不用畫圖兩小時。亮點②&#xff1a;AI智能轉換超貼心&#xff0c;MySQL轉PostgreSQL只需點個按鈕&#xff0c;跨平臺遷移…