初識設計模式 - 迭代器模式

来源:https://www.cnblogs.com/fatedeity/archive/2022/10/14/16790480.html
-Advertisement-
Play Games

顧名思義,迭代器就是用於迭代操作的對象,其能夠像有序序列一樣迭代獲取集合中對象,並且能夠記錄下當前所在位置,因此也稱游標。 ...


簡介

迭代器設計模式(Iterator Design Pattern),也叫作游標設計模式(Cursor Design Pattern)。

迭代器模式將集合對象的遍歷操作從集合類中拆分出來,放到迭代器類中,讓兩者的職責更加單一。

其定義是,提供一種方法來訪問聚合對象,而不暴露這個對象的內部實現。

典型實現

首先,定義一個用於遍歷聚合對象中所存儲元素的抽象迭代器介面,其代碼示例如下:

public interface Iterator {
    // 將游標指向第一個元素
    public void first();
    // 將游標指向下一個元素
    public void next();
    // 判斷是否存在下一個元素
    public boolean hasNext();
    // 獲取游標指向的當前元素
    public Object currentItem();
}

然後,我們通常將存儲數據的類稱作為聚合類,一般會在聚合類中創建迭代器對象,如下是抽象聚合介面的代碼示例:

public interface Aggregate {
    public Iterator creteIterator();
}

在具體迭代器類中,我們需要註入聚合對象,以便後續使用迭代器時能訪問到其數據,其代碼示例如下:

public class ConcreteIterator implements Iterator {
    private Aggregate objects;
    private Object cursor;

    public ConcreteIterator(Aggregate objects) {
        this.objects = objects;
    }

    // 將游標指向第一個元素
    public void first() {}
    // 將游標指向下一個元素
    public void next() {}
    // 判斷是否存在下一個元素
    public boolean hasNext() {}
    // 獲取游標指向的當前元素
    public Object currentItem() {}
}

在具體聚合類中,通常是實現存儲數據的邏輯,以及指定具體迭代器的對象,其代碼示例如下:

public class ConcreteAggregate implements Aggregate {
    public Iterator creteIterator() {
        return new ConcreteIterator(this);
    }
}

總結

優點

迭代器模式的主要優點如下:

  • 封裝性良好,訪問一個聚合對象的內容而無需暴露它的內部實現
  • 將遍歷操作交給迭代器,簡化了複雜聚合類的設計
  • 支持以不同的方式遍歷聚合對象,在同一個聚合對象上可以定義多種遍歷方式
  • 增加新的聚合類和迭代器類都很方便,滿足開閉原則

缺點

迭代器模式的主要缺點如下:

  • 迭代器模式將存儲數據和遍曆數據的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加
  • 抽象迭代器的設計難度較大,需要充分考慮系統將來的擴展

適用場景

迭代器模式的適用場景如下:

  • 訪問一個聚合對象的內容而無需暴露它的內部實現
  • 需要為一個聚合對象提供多種遍歷方式
  • 為遍歷不同的聚合對象提供一個統一的介面

源碼

在 Java 中,迭代器的應用非常廣。

最頂層的 Collection 集合介面繼承了 Iterable 介面,其實表明瞭所有的集合對象都是可迭代對象,並且都需要實現獲取 Iterator 對象的方法。

將這個源碼映射到典型實現中,Iterable 介面和 Collection 介面就是抽象聚合介面,Iterator 介面則是抽象迭代器介面。

首發於翔仔的個人博客,點擊查看更多。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫安裝 選擇全新安裝模式繼續安裝 輸入產品秘鑰:這裡使用演示秘鑰進行 接受許可 規則檢測 可以後期再開放防火牆對外埠 選擇需要安裝的功能,想省事可以選擇【全選】 可以安裝JDK,這邊選擇取消 Polybase 查詢服務 使用預設實例 伺服器配置–預設即可 伺服器配置 Reporting Ser ...
  • 設置MySQL 創建資料庫,預設為UTF-8 下載地址:https://downloads.mysql.com/archives/installer/ 安裝 網站上只有 x86 沒有 x64 位,之前下了 x64 的zip 包,配置比較麻煩,其實這個 x86 包裡面,已經包含了 x64的包 我這邊選 ...
  • 邏輯存儲結構 邏輯存儲結構圖 表空間 表空間文件在Linux下存放在 /var/lib/mysql文件中的 xxx.ibd 文件就是表空間文件 表空間文件用來存儲,記錄,索引等數據。 段 段分為,數據段(Leaf node segment) ,索引段(Non-leaf node segment),回 ...
  • 需要工具: 1、apktool:獲取資源文件,提取圖片文件,佈局文件,還有一些XML的資源文件 2、dex2jar:將APK反編譯成Java源碼(將classes.dex轉化為jar文件) 3、**jd-gui:**查看轉換後的jar文件 1、使用apktool獲得資源文件以及xml文件 1.1、下 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1.起因 最近有一個需求,需要使用自定義插件,來對接硬體功能,需要配合對手機的許可權進行判斷和提示,併在對接後對本地文件進行操作,這裡給大家分享下我的碰到的問題,廢話不多說,開搞 2.對接自定義插件,製作自定義基座 manifest.jso ...
  • 在 《JS 模塊化》系列開篇中,曾提到前端技術的發展不斷融入很多後端思想,形成前端的“四個現代化”:工程化、模塊化、規範化、流程化。在該系列文章中已詳細介紹了模塊化的發展及四種模塊化規範。本文簡單聊聊規範化中的 git 規範。 ...
  • 這段時間在開發一個騰訊文檔全品類通用的 HTML 動態服務,為了方便各品類接入的生成與部署,也順應上雲的趨勢,考慮使用 Docker 的方式來固定服務內容,統一進行製品版本的管理。本篇文章就將我在服務 Docker 化的過程中積累起來的優化經驗分享出來,供大家參考。 以一個例子開頭,大部分剛接觸 D ...
  • 1 什麼是流程引擎 流程引擎是一個底層支撐平臺,是為提供流程處理而開發設計的。流程引擎和流程應用,以及應用程式的關係如下圖所示。 常見的支撐場景有:Workflow、BPM、流程編排等。本次分享,主要從BPM流程引擎切入,介紹流程引擎的架構設計方法。 1.1 什麼是流程 簡單來說,流程就是一系列活動 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...