Iterator模式

来源:https://www.cnblogs.com/ekko-w/archive/2023/03/05/17180227.html
-Advertisement-
Play Games

在企業的商業活動中,訂單是指交易雙方的產品或服務交易意向。交易下單負責創建這個交易雙方的產品或服務交易意向,有了這個意向後,買方可以付款,賣方可以發貨。 在電商場景下,買賣雙方沒有面對面交易,許多情況下需要通過超時處理自動關閉訂單 ...


Part1 ITerator模式

作用:迴圈不依賴具體的集合實現,擴展性比較好。

1.1 Iterator模式

使用Java語言顯示數據arr中的元素時,我們可以使用下麵的for迴圈語句遍曆數組。

for (int i = 0; i < arr.length; i++) {
    System.out.println("i = " + i);
  }

將此處i的作用抽象化、通化後形成的模式,在設計模式中稱為Iterator模式
Iterator模式用於在數據集合中按照順序遍歷集合。英語中Iterator意味反覆做某事,漢語中稱之為“迭代器”。

1.2 示常式序

來看一段實現了Iterator模式的示常式序。這段示常式序的作用是將書(Book)放到書架(Bookshelf)中,並將書的名字按順序顯示出來。

示常式序示意圖

Iterator模式重點概念:

名稱 說明 角色
Aggregate 介面 表示集合的介面 集合
Iterator 介面 遍歷集合的介面 迭代器
Book 類 表示 書的類
BookShelf 類 表示書架類 具體的集合
BookShelfIterator 類 表示遍曆書架的類 具體的迭代器

類圖說明
在這裡插入圖片描述

代碼清單1-1 Aggregate介面

public interface Aggregate {
	public abstract Iterator iterator();
}

在Aggregate介面中聲明的方法只有一個——iterator()方法。該方法會生成一個用於遍歷集合的迭代器。
想要遍歷集合中的元素時,調用Aggregate#iterator() 方法來生成一個實現了Iterator介面的 類的實例。
代碼清單1-2 Iterator介面

public interface Iterator {
    Boolean hasNext();
    Object next();
}

hasNext()是否還存在元素,用來控制是否需要進行下次遍歷。
next()方法,獲取當前下標位置的對象,並移動下標位置。
代碼清單1-3 Book類

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    String name;
}

Book實體類
代碼清單1-4 BookShelf

@Data
public class BookShelf implements Aggregate{
    Book[] books;
    Integer last = 0;
    public BookShelf(Integer maxSize) {
        this.books = new Book[maxSize];
    }
    public Book getIndexAt(Integer index){
        return books[index];
    }
    public void appendBook(Book book){
        this.books[last] = book;
        last++;
    }

    public Integer getLength(){
        return last;
    }
    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

書架實體類。 需要將此類作為集合處理,所以需要繼承集合類Aggregate,實現獲取迭代器方法iterator();
代碼清單1-5 BookShelfIterator

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;
    
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    @Override
    public Boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return Boolean.TRUE;
        }else {
            return Boolean.FALSE;
        }
    }
    @Override
    public Object next() {
        Book book = bookShelf.getIndexAt(index);
        index++;
        return book;
    }
}

用於遍曆書架的類,需要有遍歷功能因此繼承了Iterator介面。

  1. 初始化時,bookShelf 屬性表明需要遍歷的書架;index 屬性表明下表的位置,初始化為0。
  2. hasNext()方法需要返回是否還有下一個元素要處理,True代表有,False代表沒有。使用index和getLength()總冊數的對比來判斷。
  3. next() 方法獲取當前下標位置的對象用做返回,並且移動下標到下個位置。
    代碼清單1-5 main函數
public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("《西游記》"));
        bookShelf.appendBook(new Book("《紅樓夢》"));
        bookShelf.appendBook(new Book("《三國演義》"));
        bookShelf.appendBook(new Book("《水滸傳》"));

        Iterator it = bookShelf.iterator();
        while(it.hasNext()){
            Book next = (Book)it.next();
            System.out.println("next = " + next);
        }
    }
}

main函數可以看出,整個while迴圈只調用了hasNext()和next()方法,並不依賴BookShelf具體的集合對象。如果集合對象發生變化,不影響這部分代碼。擴展性比較好。


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

-Advertisement-
Play Games
更多相關文章
  • 依賴的類: 1 "use strict"; 2 3 var __emptyPoint = null, __emptyPointA = null; 4 5 const ColorRefTable = { 6 "aliceblue": "#f0f8ff", 7 "antiquewhite": "#fae ...
  • 初探富文本之CRDT協同實例 在前邊初探富文本之CRDT協同演算法一文中我們探討了為什麼需要協同、分散式的最終一致性理論、偏序集與半格的概念、為什麼需要有偏序關係、如何通過數據結構避免衝突、分散式系統如何進行同步調度等等,這些屬於完成協同所需要瞭解的基礎知識,實際上當前有很多成熟的協同實現,例如aut ...
  • 功能介紹 平臺採用B/S結構,後端採用主流的Python語言進行開發,前端採用主流的Vue.js進行開發。 整個平臺包括前臺和後臺兩個部分。 前臺功能包括:首頁、圖書詳情頁、用戶中心模塊。 後臺功能包括:總覽、借閱管理、圖書管理、分類管理、標簽管理、評論管理、用戶管理、運營管理、日誌管理、系統信息模 ...
  • Canvas var canvas = document.querySelector('.myCanvas'); var width = canvas.width = window.innerWidth; var height = canvas.height = window.innerHeight ...
  • 離職在家 閑來無事看最近ChatGPT很火 花了一天時間 用Uniapp寫了一個小程式端的ChatGPT,實在是看不慣~ 一大堆利用ChatGPT收費的應用(小程式) 整個開源的玩玩 另外主要是自己本身是後端開發人員~ 剛好用uniapp實踐一下小程式開發 先看看主頁面效果圖吧 演示視頻-> 做一個 ...
  • 前言 用數據生成CAD圖,一般採用的ObjectArx對CAD二次開發完成。ObjectARX是AutoDesk公司針對AutoCAD平臺上的二次開發而推出的一個開發軟體包,它提供了以C++為基礎的面向對象的開發環境及應用程式介面,能訪問和創建AutoCAD圖形資料庫。而由於現在懂C++的人少,很多 ...
  • 這篇文章主要描述如何進行消息隊列產品選型,包括產品選型需要考慮的因素、三種比較流行的消息隊列產品的優缺點以及如何根據我們的使用場景選擇合適的消息隊列產品。 ...
  • OneAPM 摘要:此篇文章主要介紹Java8 Lambda 表達式產生的背景和用法,以及 Lambda 表達式與匿名類的不同等。本文系OneAPM工程師編譯整理。 Java是一流的面向對象語言,除了部分簡單數據類型,Java 中的一切都是對象,即使數組也是一種對象,每個類創建的實例也是對象。在 J ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...