1. 程式人生 > >16.java設計模式之迭代器模式

16.java設計模式之迭代器模式

#### 基本需求: * 展示一個學校的結構,比如一個學校下面有多個學院,學院下面有多個系,對其節點主要是遍歷,與組合模式略有不同 #### 傳統方案: * 學校<-學院<-系 依次繼承 * 這種方式,在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系,因此這種方案,不能很好實現的遍歷的操作,並且他們之間也沒有繼承關係,使用繼承並不合適 #### 基本介紹: * 迭代器模式(Iterator)是常用的設計模式,屬於行為型模式,這種模式用於順序訪問集合物件的元素,不需要知道集合物件的底層表示 * 如果我們的集合元素是用不同的方式實現的,有陣列,還有java的集合類,或者還有其他方式,當客戶端要遍歷這些集合元素的時候就要使用多種遍歷方式,而且還會暴露元素的內部結構,可以考慮使用迭代器模式解決 * 迭代器模式提供一種遍歷集合元素的統一介面,用一致的方法遍歷集合元素,不需要知道集合物件的底層表示,即:不暴露其內部的結構 * 把在元素之間遊走的責任交給迭代器,而不是聚合物件 * 由於迭代器模式將儲存資料和遍歷資料的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性 * UML類圖(原理) * ![](https://img2020.cnblogs.com/blog/2093590/202012/2093590-20201202164317933-355110768.png) * 說明 * Iterator:迭代器介面,直接使用JDK提供的即可提供,含有hasNext, next, remove * ConcreteIterator:具體的迭代器類,進行元素迭代,其內部元素的以不同的方式進行儲存,例如陣列、list等 * Aggregate:一個統一的聚合介面,將客戶端和具體聚合解耦,進行元素的儲存 * ConcreteAggreage:具體的聚合持有物件集合,並提供一個方法,返回一個迭代器,該迭代器可以正確遍歷集合,和ConcreteIterator一一對應 * Element:集合內部所儲存的元素 * 實際情況中一般將ConcreteIterator作為內部類放入ConcreteAggreage類中,直接省去了元素集合elementes的傳遞 * UML類圖(案例) * ![](https://img2020.cnblogs.com/blog/2093590/202012/2093590-20201202164330838-1516660556.png) * 說明 * OutputImpl:用於輸出資訊的輔助類 * 程式碼實現 * 迭代器類不作為持有迭代集合類的內部類 * >```java >@Data >@AllArgsConstructor >public class Department { > > // 迭代器內部元素 > > private String name; > > private String description; > >} >``` > > * >```java >public class ComputerCollegeIterator implements Iterator { > > // 計算機學院迭代器,元素使用陣列儲存 一般會將迭代器實現類作為需要迭代物件的內部類 > > private Department[] departments; > > // 當前位置指標 > private int index = 0; > > public ComputerCollegeIterator(Department[] departments) { > this.departments = departments; > } > > // 判斷是否有下一個元素 > @Override > public boolean hasNext() { > return !(this.index >= this.departments.length); > } > > // 返回下一個元素 > @Override > public Department next() { > return this.departments[this.index++]; > } > > @Override > public void remove() { > // 移除方法空實現 > } > >} >``` > > * >```java >public class InfoCollegeIterator implements Iterator { > > // 資訊工程學院迭代器,元素使用List集合儲存 一般會將迭代器實現類作為需要迭代物件的內部類 > > priv