16.java設計模式之迭代器模式
阿新 • • 發佈:2020-12-02
#### 基本需求:
* 展示一個學校的結構,比如一個學校下面有多個學院,學院下面有多個系,對其節點主要是遍歷,與組合模式略有不同
#### 傳統方案:
* 學校<-學院<-系 依次繼承
* 這種方式,在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系,因此這種方案,不能很好實現的遍歷的操作,並且他們之間也沒有繼承關係,使用繼承並不合適
#### 基本介紹:
* 迭代器模式(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