?這里是第七人格的博客?小七,歡迎您的到來~?
🍅系列專欄:設計模式🍅
??本篇內容: 迭代器模式??
🍱 本篇收錄完整代碼地址:https://gitee.com/diqirenge/design-pattern 🍱
楔子
很久沒有更新文章了,一方面是工作比較忙,另一方面家里又迎來了新的小生命,短暫休整一下后,小七又決定出來賣藝了。今天我們聊一下迭代器模式。
需求背景
很多公司的組織架構都是樹形結構,每一個節點都是一個部門,每一個部門包含很多員工,現在需要遍歷這些員工,考慮使用樹的深度遍歷。
分析設計
在實現迭代器模式之前,我們可以先參考下 Java 中 List 類是如何實現迭代器的,類圖如下
開發會按照這個模式來實現,這個模式主要分為以下?塊;
- Collection,集合?法部分?于對?定義的數據結構添加通??法; add 、 remove 、 iterator
等核??法。
Iterable,提供獲取迭代器,這個接?類會被 Collection 繼承。
Iterator,提供了兩個?法的定義; hasNext 、 next ,會在具體的數據結構中寫實現?式。
UML圖
根據分析設計,我們可以先畫一個簡單的UML圖,后面通過UML圖編碼
模塊名稱
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、測試結果
姓名:張三,職位:經理
姓名:李四,職位:工程師
姓名:王五,職位:設計師
實現要點
迭代器模式實現要點如下:
- 抽象迭代器(Iterator):定義了遍歷集合對象所需的接口,通常包括
hasNext()
和next()
方法,用于判斷是否還有下一個元素以及獲取下一個元素。 - 具體迭代器(Iterator):實現抽象迭代器接口的具體類,負責具體的遍歷邏輯。它保存了當前遍歷的位置信息,并可以根據需要向前或向后遍歷集合元素。
- 聚合對象(Iterable):是迭代器模式的目標對象,通常是一個集合或容器,包含了多個元素。聚合對象提供創建具體迭代器的方法,以便外部可以通過迭代器訪問其內部的元素。
- 隔離集合的遍歷和實現:迭代器模式將集合的遍歷方式與集合的內部表示分離,使得可以在不暴露集合內部結構的情況下訪問集合中的元素。
- 增加遍歷的靈活性:通過迭代器模式,可以靈活地為集合對象增加不同的遍歷方法,而不需要修改集合對象的代碼。
- 支持多種遍歷方式:迭代器模式允許定義多種遍歷方式,例如順序遍歷、逆序遍歷等,只需要提供相應的具體迭代器實現即可。
- 簡化外部操作:外部代碼只需通過迭代器的接口與集合交互,無需關心集合的內部結構和遍歷細節,簡化了外部代碼的復雜性。
總結
迭代器模式遵循開閉原則,對擴展開放,對修改封閉。當需要增加新的遍歷方式時,只需添加新的具體迭代器類,無需修改現有代碼。每個類只關注一項任務,也符合單一職責原則。
面對對象面對君,不負代碼不負卿