設計模式Java實現-迭代器模式

?這里是第七人格的博客?小七,歡迎您的到來~?

🍅系列專欄:設計模式🍅

??本篇內容: 迭代器模式??

🍱 本篇收錄完整代碼地址:https://gitee.com/diqirenge/design-pattern 🍱

楔子

很久沒有更新文章了,一方面是工作比較忙,另一方面家里又迎來了新的小生命,短暫休整一下后,小七又決定出來賣藝了。今天我們聊一下迭代器模式。

需求背景

很多公司的組織架構都是樹形結構,每一個節點都是一個部門,每一個部門包含很多員工,現在需要遍歷這些員工,考慮使用樹的深度遍歷。

分析設計

在實現迭代器模式之前,我們可以先參考下 Java 中 List 類是如何實現迭代器的,類圖如下

file

開發會按照這個模式來實現,這個模式主要分為以下?塊;

  1. Collection,集合?法部分?于對?定義的數據結構添加通??法; add 、 remove 、 iterator

等核??法。

  1. Iterable,提供獲取迭代器,這個接?類會被 Collection 繼承。

  2. Iterator,提供了兩個?法的定義; hasNext 、 next ,會在具體的數據結構中寫實現?式。

UML圖

根據分析設計,我們可以先畫一個簡單的UML圖,后面通過UML圖編碼

file

模塊名稱

iterator

模塊地址

https://gitee.com/diqirenge/design-pattern/tree/master/src/main/java/com/run2code/design/behavioral/iterator

模塊描述

迭代器模式代碼示例

代碼實現

1、參考jdk的Iterator,編寫迭代器接口

①、是否有下一個節點

②、獲取下一個節點

/*** 迭代器接口,主要提供hasNext、next兩個方法,參考jdk的Iterator設計* @see java.util.Iterator 接口* 關注公眾號【奔跑的碼畜】,一起進步不迷路** @author 第七人格* @date 2024/01/30*/
public interface Iterator<E> {boolean hasNext();E next();}

2、參考jdk的Iterable,編寫Iterable,提供一個獲取迭代器的方法

/*** 提供獲取迭代器的方法,參考jdk的Iterable設計* @see java.lang.Iterable 接口* 關注公眾號【奔跑的碼畜】,一起進步不迷路** @author 第七人格* @date 2024/01/30*/
public interface Iterable<T> {Iterator<T> iterator();}

3、參考jdk的Collection,編寫集合接口

該接口繼承Iterable,拓展了基礎的添加和刪除方法

/*** 集合接口,參考jdk的Collection設計* @see java.util.Collection 接口* 關注公眾號【奔跑的碼畜】,一起進步不迷路** @author 第七人格* @date 2024/01/30*/
public interface Collection<E> extends Iterable<E> {boolean add(E e);boolean remove(E e);Iterator<E> iterator();}

4、編寫員工類

/*** 員工類* 關注公眾號【奔跑的碼畜】,一起進步不迷路** @author 第七人格* @date 2024/01/30*/
public class Employee {private String name;private String position;public Employee(String name, String position) {this.name = name;this.position = position;}public String getName() {return name;}public String getPosition() {return position;}
}

5、編寫組織類

實現Iterable接口,編寫iterator()方法

/*** 組織類* 實現Iterable接口的iterator()方法,返回一個Iterator實例* 關注公眾號【奔跑的碼畜】,一起進步不迷路** @author 第七人格* @date 2024/01/30*/
public class Organization implements Iterable<Employee> {private List<Employee> employees;public Organization() {employees = new ArrayList<>();}public void addEmployee(Employee employee) {employees.add(employee);}@Overridepublic Iterator<Employee> iterator() {return new OrganizationIterator(employees);}}

6、編寫組織器迭代類

主要完成hasNext和next兩個方法的邏輯編寫

/*** 組織迭代器類* 實現Iterator類,用于遍歷組織結構中的員工。* 關注公眾號【奔跑的碼畜】,一起進步不迷路** @author 第七人格* @date 2024/01/30*/
public class OrganizationIterator implements Iterator<Employee> {private List<Employee> employees;private int currentIndex;public OrganizationIterator(List<Employee> employees) {this.employees = employees;currentIndex = 0;}@Overridepublic boolean hasNext() {return currentIndex < employees.size();}@Overridepublic Employee next() {return employees.get(currentIndex++);}
}

7、編寫測試類

/*** 測試迭代器模式* 關注公眾號【奔跑的碼畜】,一起進步不迷路** @author 第七人格* @date 2024/01/30*/
public class IteratorTest {@Testpublic void testIterator() {Organization organization = new Organization();organization.addEmployee(new Employee("張三", "經理"));organization.addEmployee(new Employee("李四", "工程師"));organization.addEmployee(new Employee("王五", "設計師"));Iterator<Employee> iterator = organization.iterator();while (iterator.hasNext()) {Employee employee = iterator.next();System.out.println("姓名:" + employee.getName() + ",職位:" + employee.getPosition());}}
}

8、測試結果

姓名:張三,職位:經理

姓名:李四,職位:工程師

姓名:王五,職位:設計師

實現要點

迭代器模式實現要點如下:

  1. 抽象迭代器(Iterator):定義了遍歷集合對象所需的接口,通常包括hasNext()next()方法,用于判斷是否還有下一個元素以及獲取下一個元素。
  2. 具體迭代器(Iterator):實現抽象迭代器接口的具體類,負責具體的遍歷邏輯。它保存了當前遍歷的位置信息,并可以根據需要向前或向后遍歷集合元素。
  3. 聚合對象(Iterable):是迭代器模式的目標對象,通常是一個集合或容器,包含了多個元素。聚合對象提供創建具體迭代器的方法,以便外部可以通過迭代器訪問其內部的元素。
  4. 隔離集合的遍歷和實現:迭代器模式將集合的遍歷方式與集合的內部表示分離,使得可以在不暴露集合內部結構的情況下訪問集合中的元素。
  5. 增加遍歷的靈活性:通過迭代器模式,可以靈活地為集合對象增加不同的遍歷方法,而不需要修改集合對象的代碼。
  6. 支持多種遍歷方式:迭代器模式允許定義多種遍歷方式,例如順序遍歷、逆序遍歷等,只需要提供相應的具體迭代器實現即可。
  7. 簡化外部操作:外部代碼只需通過迭代器的接口與集合交互,無需關心集合的內部結構和遍歷細節,簡化了外部代碼的復雜性。

總結

迭代器模式遵循開閉原則,對擴展開放,對修改封閉。當需要增加新的遍歷方式時,只需添加新的具體迭代器類,無需修改現有代碼。每個類只關注一項任務,也符合單一職責原則。

面對對象面對君,不負代碼不負卿

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

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

相關文章

Java Spring 中使用緩存來提高性能

在Spring框架中&#xff0c;緩存是一種用于提高應用程序性能的重要機制。通過緩存&#xff0c;可以減少對數據庫或其他外部資源的訪問次數&#xff0c;從而加快應用程序的響應速度。以下是如何在Spring中使用緩存來提高性能的詳細過程&#xff1a; 1. 引入緩存依賴 首先&…

蒼穹外賣Day06筆記(復習了jwt的加密解密和傳遞)

瘋玩了一個月&#xff0c;效率好低&#xff0c;今天開始撿起來蒼穹外賣~ 1. 為什么不需要單獨引入HttpClient的dependency&#xff1f; 因為我們在sky-common的pom.xml中已經引入了aliyun-sdk-oss的依賴&#xff0c;而這個依賴低層就引入了httpclinet的依賴&#xff0c;根據依…

C語言從頭學05——頭文件及庫文件

我們寫"Hello World!"程序時&#xff0c;一上來先寫了一句代碼&#xff1a; #include <stdio.h> 我們看上面這條代碼&#xff0c;前面有個"#"號后邊沒有";"號&#xff0c;這樣的代碼不是普通的C語言代碼&#xff0c;它屬于預處理命令。這…

代碼隨想錄算法訓練營第六天| 242. 有效的字母異位詞、349. 兩個數組的交集、202. 快樂數、1. 兩數之和

哈希表理論基礎 [LeetCode] 242. 有效的字母異位詞 [LeetCode] 242. 有效的字母異位詞 文章解釋 [LeetCode] 242. 有效的字母異位詞 視頻解釋 題目: 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出…

JavaEE技術之SpringCloud(Nacos注冊中心、Nacos配置中心、Sentinel實現熔斷與限流)

文章目錄 SpringCloud Alibaba1、簡介1.1 背景1.2 Nacos主要功能1.3 Nacos和SpringBoot、SpringCloud版本選擇 2、Nacos注冊中心2.1 案例準備2.2 Nacos注冊中心下載啟動2.2.1 下載2.2.2 解壓啟動2.2.3 nacos-server訪問測試 2.3 nacos注冊中心客戶端整合2.3.1 訂單服務整合naco…

YTU 3166 共享單車 DFS 記憶化搜索

問題 D: 共享單車 題目描述 共享單車走進煙臺&#xff0c;小明決定嘗試。小明啟動共享單車 App&#xff0c;輕松地找到附近的單車。那么問題來了&#xff0c;到最近的那輛單車&#xff0c;小明大約要走多少米呢&#xff1f; 現在簡化問題。將地圖設定成一個由 100100 米的像…

【UE】仿原神實現無限道路延伸的開場效果

目錄 效果 步驟 一、無限生成磚塊 二、制作門 三、停止移動并生成門 四、進入門 效果 步驟 一、無限生成磚塊 1. 新建一個Basic關卡&#xff0c;再新建一個Pawn類&#xff0c;這里命名為“BP_MyPawn” 打開“BP_MyPawn”&#xff0c;添加一個膠囊體碰撞組件和一個攝像…

工器具管理(基于若依)

文章目錄 前言一、工器具管理項目總覽 二、入庫功能1. 前端1.1 界面展示1.2 具體操作實現1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具入庫 三、領用功能1. 前端1.1 界面展示1.2 具體實現操作1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具領用 遇到的問題1. 同一頁面展示…

pat乙1033-舊鍵盤打字

1測試點2&#xff1a; 輸入的字符串如果為空&#xff0c;要用getline(cin,s)&#xff0c;而不是cin>>s&#xff0c;否則程序做不了 2題目說的如果上鍵壞了那大寫字母打印不了&#xff0c;不是大寫轉小寫打印啦&#xff0c;認真讀題 3兩個for循環長這樣&#xff0c;break…

基于springboot+vue的自習室管理和預約系統(全套)

一、系統架構 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代碼及數據庫 三、功能介紹 01. web端-首頁1 02. web端-首頁2 03. web端-注冊 04. web端-登錄 05. w…

牛客Linux高并發服務器開發學習第六天

目錄相關函數 學習進度&#xff1a; Linux系統編程入門 06&#xff1a;59&#xff1a;42

Apollo9.0 Control模塊算法源碼學習

參考資料 Apollo控制算法_嗶哩嗶哩_bilibili

Python自動化測試 | 如何使用Robot Framework進行自動化測試?

你還在手動測試&#xff1f;不妨了解一下更高效、準確且簡單的測試方法——使用Python的Robot Framework進行自動化測試。 什么是Robot Framework&#xff1f; Robot Framework是一款開源的Python自動化測試框架&#xff0c;它基于關鍵字驅動的思想&#xff0c;具有易讀、易擴…

每日一題 城市群的數量

題目解析 城市群數量_牛客題霸_牛客網 當解決這個問題時&#xff0c;首先需要理解題目要求。題目中給出了一個城市之間的鄰接矩陣&#xff0c;矩陣中的元素表示城市之間是否直接相連。如果兩個城市直接相連&#xff0c;或者通過其他城市間接相連&#xff0c;它們就屬于同一個城…

算法學習筆記(匈牙利算法)

匈牙利算法可以求解二分圖的最大匹配問題&#xff08;二分圖&#xff1a;如果無向圖 G ( V , E ) G (V, E) G(V,E)的所有點可以分為兩個集合 V 1 、 V 2 V_1、V_2 V1?、V2?&#xff0c;所有的邊都在 V 1 V_1 V1?和 V 2 V_2 V2?之間&#xff0c;而 V 1 V_1 V1?或 V 2 V_2…

深入理解Python的類,實例和type函數

問題起源&#xff1a; class t():pass s1 t() s2 type("Student2",(),{}) isinstance(s1, type), isinstance(s2, type)為什么第一個是false&#xff0c;第二個是true呢 根因定位&#xff1a; 在Python中&#xff0c;一切皆對象&#xff0c;類是對象&#xff0c…

nacos在沒有指定數據源的情況下默認使用什么數據庫?

在沒有特別指定數據源的情況下&#xff0c;Nacos 默認使用內嵌的數據庫 Derby 來存儲其數據。Derby 是一個輕量級的、基于 Java 的數據庫管理系統&#xff0c;適合于開發和測試環境&#xff0c;因為它簡單易部署且無需額外的數據庫服務器。然而&#xff0c;對于生產環境&#x…

使用ORM快速獲取業務對象列表

通常在實際開發中&#xff0c;業務對象的信息是需要來自多個數據表的。 我們如果想要獲取這個業務對象&#xff0c;就要先查詢數據表&#xff0c;再把查詢到的數據依次循環&#xff0c;組合轉換封裝成業務要使用的對象類型列表。 如果使用了ORM&#xff0c;那么這個過程就可以簡…

Stability AI 推出 Stable Artisan,終于可以在Discord上使用Stable Diffusion了!

Stable Diffusion 社區最常見的要求之一是能夠直接在 Discord 上使用他們的模型。近期&#xff0c;Stability AI 推出 Stable Artisan&#xff0c;這個需求終于被實現了。 Stable Artisan 支持在 Discord 上生成媒體&#xff0c;由 Stability AI 的尖端圖像和視頻模型 Stable D…

基于Springboot的實習生管理系統(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的實習生管理系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構&a…