23種設計模式-行為型模式-迭代器

文章目錄

  • 簡介
  • 問題
  • 解決
    • 代碼
    • 設計關鍵點:
  • 總結

簡介

迭代器是一種行為設計模式,讓你能在不暴露集合底層表現形式(列表、棧和樹等)的情況下遍歷集合中所有的元素。

問題

集合是編程中最常使用的數據類型之一。 大部分集合使用簡單列表存儲元素。但有些集合還會使用棧、樹、 圖 和其他復雜的數據結構。
無論集合的構成方式是咋樣的,它都必須提供某種訪問元素的方式,便于 其他代碼使用其中的元素。 集合應提供一種能夠遍歷元素的方式, 并且保證它不會重復地訪問同一個元素。
如果你的集合基于列表, 遍歷就會比較簡單。但怎么遍歷復雜數據結構(例如樹)中的元素呢? 比如 今天你需要使用深度 優先算法來遍歷樹結構, 明天可能會需要廣度優先算法; 下周則可能會需要其他方式(比如隨機存取樹中的元素)。 如下圖。

需要通過不同的方式遍歷相同的集合

這個時候,你可能不斷往集合里添加遍歷算法,這會讓集合本身的職責(“高效存儲數據” )變得模糊,不符合單一職責原則。另外 有些算法可能是根據特定應用訂制的, 把他加到泛型集合類中會 顯得非常奇怪。
另一方面, 使用多種集合的客戶端代碼可能并不關心存儲數據的方式,不過由于集合提供不同的元素訪問方式, 你的代碼就不得不跟特定集合類進行耦合。

解決

迭代器模式的主要思想是將集合的遍歷行為抽取成單獨的迭代器對象。

迭代器可實現多種遍歷算法。 多個迭代器對象可同時遍歷同一個集合

除實現自身算法外, 迭代器還封裝了遍歷操作的所有細節, 比如當前 位置和末尾剩余元素的數量。 因此,多個迭代器可以在相互獨立的情況下同時訪問集合。
迭代器通常會提供一個獲取集合元素的基本方法。 客戶端可以不斷調用這個方法直到它不返回任何內容, 也就是說迭代器已經遍歷了所有元素。
所有迭代器必須實現相同的接口。這樣一來,只要有合適的迭代器,客戶端代碼就能兼容任何類型的集合或遍歷算法。 如果你需要采用特殊方式來遍歷集合, 只需創建一個新的迭代器類即可, 不需要對集合或客戶端進行修改。

代碼

// 1.Iterator接口 (定義遍歷標準)
interface TreeIterator<T> {boolean hasNext();T next();
}// 2.Concrete Iterator(實現廣度優先遍歷)
class BfsIterator implements TreeIterator<TreeNode> {private Queue<TreeNode> queue = new LinkedList<>();public BfsIterator(TreeNode root) {if(root != null) queue.add(root);}public boolean hasNext() {   // 判斷是否有下一節點return !queue.isEmpty();}public TreeNode next() {     // 按層遍歷樹節點TreeNode current = queue.poll();for(TreeNode child : current.getChildren()) {queue.add(child);}return current;}
}// 3.Collection接口(樹結構抽象)
interface TreeCollection {TreeIterator<TreeNode> createBfsIterator(); // 創建特定迭代器
}// 4.Concrete Collection(樹節點實現)
class TreeNode implements TreeCollection {private String data;private List<TreeNode> children = new ArrayList<>();public TreeNode(String data) { this.data = data; }public void addChild(TreeNode node) {children.add(node);}public List<TreeNode> getChildren() { return children; }public TreeIterator<TreeNode> createBfsIterator() {return new BfsIterator(this); // 自身作為遍歷起點}
}// 5.Client使用示例
public class TreeClient {public static void main(String[] args) {/* 構建樹結構:A/ \B   C/ \D   E*/TreeNode root = new TreeNode("A");TreeNode nodeB = new TreeNode("B");TreeNode nodeC = new TreeNode("C");root.addChild(nodeB);root.addChild(nodeC);nodeC.addChild(new TreeNode("D"));nodeC.addChild(new TreeNode("E"));// 獲取BFS迭代器TreeIterator<TreeNode> iterator = root.createBfsIterator();// 遍歷樹節點while(iterator.hasNext()) {System.out.println(iterator.next().data); // 依次輸出 A → B → C → D → E}}
}

設計關鍵點:

  1. 解耦遍歷算法:BfsIterator封裝廣度優先的具體邏輯
  2. 擴展性強:新增DfsIterator無需修改樹結構代碼
  3. 多態迭代:客戶端通過統一接口操作不同遍歷方式

總結

在這里插入圖片描述

  1. (Iterator)接口聲明了遍歷集合所需的操作:獲取下一個元素、 獲取當前位置和重新開始迭代等。
  2. (Concrete Iterators)實現遍歷集合的一種特定算法。迭代器對象必須跟蹤自身遍歷的進度。這就讓多個迭代器可以相互獨立地遍歷同一集合。
  3. (Collection) 接口聲明一個或多個方法來獲取與集合兼容的迭代器。注意,方法返回的類型必須被聲明成迭代器接口, 這樣具體集合可以返回各種不同種類的迭代器。
  4. (Concrete Collections)會在客戶端請求迭代器時返回一個特定的具體迭代器類實體。
  5. (Client) 通過集合和迭代器的接口來和這兩者進行交互。 這樣一來,客戶端不需要跟具體類耦合,允許同一客戶端代碼使用各種不同的集合和迭代器。 客戶端通常不會自行創建迭代器,而是會從集合里獲取。但在特定情況下,客戶端可以直接創建一個迭代器(比如當客戶端需要自定義特殊迭代器時)。

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

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

相關文章

Python 布爾類型

Python 布爾類型(Boolean) 布爾類型是Python中的基本數據類型之一&#xff0c;用于表示邏輯值。它只有兩個值&#xff1a; True - 表示真False - 表示假 1. 布爾值的基本使用 # 定義布爾變量 is_active True is_admin Falseprint(is_active) # 輸出: True print(is_admi…

人工智能在前端開發中的應用探索

一、人工智能在前端開發中的應用場景 人工智能&#xff08;AI&#xff09;技術的快速發展為前端開發帶來了新的機遇和挑戰。AI在前端開發中的應用主要集中在以下幾個方面&#xff1a;智能代碼生成、自動化測試、個性化推薦、智能交互設計以及性能優化。這些應用場景不僅提高了…

三維掃描助力文化遺產數字化保護

當下&#xff0c;三維掃描技術以其獨特的優勢&#xff0c;正逐漸成為文化遺產數字化保護的重要工具&#xff0c;讓珍貴的文物得以“永生”。 三維掃描在文物數字化方面的應用&#xff1a; 高精度文物存檔&#xff1a;三維掃描技術能夠實現對文物的快速、無損掃描&#xff0c;…

如何將生活場景轉換為數據模型模型仿真?

從家到公司有31公里&#xff0c;其中有一個2車道右轉立交橋匯入另外一條路&#xff0c;每次都是那個堵車&#xff0c;導致路上的行程在45分鐘到70分鐘左右&#xff1f;前面或后面路段都是3-4車道&#xff0c;足夠通行。如何解決這個難題&#xff0c;是否可搭建數學模型實現可視…

Java學習總結-io流-練習案例

將文檔的內容排序&#xff1a; public static void main(String[] args) throws IOException {File dir new File("J:\\360downloads\\wpcache\\srvsetwp\\xxx\\test.txt");BufferedReader br new BufferedReader(new FileReader(dir));//把按行讀取到的內容&#…

【C++】STL庫_stack_queue 的模擬實現

棧&#xff08;Stack&#xff09;、隊列&#xff08;Queue&#xff09;是C STL中的經典容器適配器 容器適配器特性 不是獨立容器&#xff0c;依賴底層容器&#xff08;deque/vector/list&#xff09;通過限制基礎容器接口實現特定訪問模式不支持迭代器操作&#xff08;無法遍歷…

LangChain核心解析:掌握AI開發的“鏈“式思維

0. 思維導圖 1. 引言 ?? 在人工智能快速發展的今天,如何有效地利用大語言模型(LLM)構建強大的應用成為眾多開發者關注的焦點。前面的課程中,我們學習了正則表達式以及向量數據庫的相關知識,了解了如何處理文檔并將其附加給大模型。本章我們將深入探討LangChain中的核心概…

Error:java: 程序包lombok不存在

使用Maven package打包項目發現報錯 一、Maven配置文件修改 1.找到本地 maven的配置文件settings.xml 2.修改配置文件中&#xff0c;指向本地倉庫的地址使用 ‘’ \ \ ‘’ 隔開&#xff0c; 要么使用 正斜線 / 隔開 不要使用 反斜線 \ windows OS 電腦&#xff0c;使用 \ …

WordPress 未授權本地文件包含漏洞(CVE-2025-2294)(附腳本)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 0x0…

基于 C# 開發視覺檢測系統項目全解析

引言 在當今高度自動化的制造業領域,視覺檢測系統的重要性愈發凸顯。它憑借高速、高精度的特性,在產品外觀缺陷檢測、尺寸測量等環節發揮著關鍵作用,顯著提升了生產效率和產品質量。C# 作為一種功能強大且易于學習的編程語言,結合.NET 框架豐富的類庫以及 Windows Forms、…

GISBox:核心功能免費的一站式三維GIS處理平臺

大家好&#xff0c;今天為大家介紹的軟件是GISBox&#xff1a;一款核心功能免費的一站式三維GIS處理平臺&#xff0c;主要是適用于數字孿生。下面&#xff0c;我們將從軟件的主要功能、支持的系統、軟件官網等方面對其進行簡單的介紹。 軟件官網&#xff1a;http://www.gisbox.…

Ubuntu 24 云服務器上部署網站_詳細版_1

從零開始&#xff0c;在 Ubuntu 24 云服務器上部署一個支持登錄和權限的網站&#xff0c;用 Python Django 實現&#xff0c;適合新手跟著操作。 &#x1f527; 第一步&#xff1a;更新服務器并安裝基礎環境 請使用 SSH 登錄你的 Ubuntu 24 云服務器&#xff08;用 MobaXterm…

單片機學習之定時器

定時器是用來定時的機器&#xff0c;是存在于STM32單片機中的一個外設。STM32一般總共有8個定時器&#xff0c;分別是2個高級定時器&#xff08;TIM1、TIM8&#xff09;&#xff0c;4個通用定時器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09;和2個基本定時器&#xff08;TI…

AIGC6——AI的哲學困境:主體性、認知邊界與“天人智一“的再思考

引言&#xff1a;當機器開始"思考" 2023年&#xff0c;Google工程師Blake Lemoine聲稱對話AI LaMDA具有"自我意識"&#xff0c;引發軒然大波。這一事件將古老的哲學問題重新拋回公眾視野&#xff1a;?**機器能否擁有主體性&#xff1f;**從東方"天人…

從內核到應用層:Linux緩沖機制與語言緩沖區的協同解析

系列文章目錄 文章目錄 系列文章目錄前言一、緩沖區1.1 示例11.2 緩沖區的概念 二、緩沖區刷新方案三、緩沖區的作用及存儲 前言 上篇我們介紹了&#xff0c;文件的重定向操作以及文件描述符的概念&#xff0c;今天我們再來學習一個和文件相關的知識-----------用戶緩沖區。 在…

高通camx IOVA內存不足,導致10-15x持續拍照后,點擊拍照鍵定屏無反應,過一會相機閃退

定屏閃退問題分析思路&#xff1a; 定屏問題如果是相機問題&#xff0c;一般會出現返幀&#xff0c;導致預覽卡死。當然還有其他情況&#xff0c;我們先看返幀情況&#xff0c;發現request和result開始都正常&#xff0c;到12:53:05.443038就沒有返幀了&#xff0c;定屏了。往…

AI知識補全(十五):AI可解釋性與透明度是什么?

名人說&#xff1a;一笑出門去&#xff0c;千里落花風。——辛棄疾《水調歌頭我飲不須勸》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知識補全&#xff08;十四&#xff09;&#xff1a;零樣本…

CentOS 7安裝hyperscan

0x00 前言 HyperScan是一款由Intel開發的高性能正則表達式匹配庫&#xff0c;專為需要快速處理大量數據流的應用場景而設計。它支持多平臺運行&#xff0c;包括Linux、Windows和macOS等操作系統&#xff0c;并針對x86架構進行了優化&#xff0c;以提供卓越的性能表現。HyperSc…

機器學習的一百個概念(9)學習曲線

前言 本文隸屬于專欄《機器學習的一百個概念》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見[《機器學習的一百個概念》 ima 知識庫 知識庫廣場搜索&…

macvlan 和 ipvlan 實現原理及設計案例詳解

一、macvlan 實現原理 1. 核心概念 macvlan 允許在單個物理網絡接口上創建多個虛擬網絡接口&#xff0c;每個虛擬接口擁有 獨立的 MAC 地址 和 IP 地址。工作模式&#xff1a; bridge 模式&#xff08;默認&#xff09;&#xff1a;虛擬接口之間可直接通信&#xff0c;類似交…