17. Iterator
關於 Iterator 本篇將討論以下幾個問題
1. 關於 Iterator
2. UML
3. 將 UML 轉為程式碼
4. 情境
測試環境:
OS:Windows 10
IDE:Visual Studio 2019
1. 關於 Iterator
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
by Gang of Four
- 提供一種在不暴露集合底層形式(Array、Queue、Stack等)的情況下遍歷集合中元素的方法
Iterator(迭代器)屬於行為型(Behavioral Patterns),當遇到對外部隱藏複雜結構集合的實作或達到特定目的,並提供遍歷接口時,可以使用 Iterator 來做為外部取用集合的接口,以提高安全和便利性。
優點:
- 符合 單一職責原則(Single Responsibility Principle)
- 符合 開閉原則(Open Closed Principle)
缺點:
- 在特定集合類型使用迭代器可能會有效能問題
- 一般不會在迭代器中處理 新增/刪除,因維護上較麻煩
2. UML
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Class 間關聯:
- Client 關聯 Iterator & Aggregate
- ConcreteAggregate 繼承 Aggregate
- ConcreteIterator 繼承 Iterator
- ConcreteAggregate 可包含 ConcreteIterator
- ConcreteIterator 關聯 ConcreteAggregate
Class:
- Client:呼叫端
- Iterator:迭代器抽象類別或介面,定義訪問或遍歷元素的接口
- ConcreteIterator:迭代器實作
- Aggregate:包含迭代器的集合的抽象類別或介面
- ConcreteAggregate:包含迭代器的集合實作
3. 將 UML 轉為程式碼
包含迭代器的集合的介面
包含迭代器的集合實作
迭代器介面
迭代器實作
- 建立集合
aggregate
- 呼叫
aggregate.CreateIterator()
建立迭代器
- 使用迭代器遍歷集合
執行結果
4. 情境
我們接到了一個取得員工資料的需求
- 員工資料中包含榮譽員工鎮店貓貓、鎮店狗狗
- 取得員工資料時,只需取得一般員工資料
※ 在高階程式語言中有更簡單的作法(e.g. foreach + where),此情境範例僅是為了更加深 Iterator 使用方式的印象
員工資料類與員工類型
包含迭代器的員工的介面
包含迭代器的員工實作
迭代器介面
迭代器實作,取得資料時排除榮譽員工
- 建立員工集合
- 呼叫
employees.CreateIterator()
建立迭代器
- 使用迭代器遍歷員工集合
執行結果
完整程式碼
GitHub:Behavioral_04_Iterator
總結
其實在高階程式語言中的集合都已經在底層實作 Iterator 了,所以我們才能夠直接對集合進行 foreach 操作,除了特定目的(e.g. 情境範例中的排除特定目標)之外,基本上也很少有機會需要自己實作 Iterator 了。
參考資料
- Design Patterns
- 大話設計模式
- dofactory
- Refactoring.Guru
新手上路,若有錯誤還請告知,謝謝