設計模式 18 迭代器模式 Iterator Pattern


設計模式 18 迭代器模式 Iterator Pattern
1.定義

迭代器模式 (Iterator Pattern) 是一種行為型設計模式,它提供了一種訪問集合元素的標準方法,而無需暴露集合的內部表示。

提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示。

核心思想來自將遍歷集合的邏輯從集合本身中分離出來,封裝到一個獨立的迭代器對象中。
迭代器對象負責維護遍歷的當前位置,并提供訪問下一個元素的方法。

想象一個書架,上面擺滿了書籍。如果你想閱讀這些書籍,你可以選擇不同的方式:

  • 直接訪問: 你直接走到書架前,從最左邊開始一本一本地拿書閱讀。
  • 使用書簽: 你用書簽標記當前閱讀的位置,下次閱讀時直接從書簽處開始。
2.內涵

迭代器模式就像使用書簽一樣,它提供了一種間接訪問集合元素的方式:

迭代器對象: 就像書簽,它記錄了當前訪問的位置。

  • next() 方法: 就像翻到下一頁,它返回下一個元素。
  • hasNext() 方法: 就像判斷是否有下一頁,它判斷是否還有下一個元素。
3.案例分析
/Iterator Design Pattern/include <iostream>
include <string>
include <vector>template <typename T, typename U>
class Iterator {public:typedef typename std::vector<T>::iterator iter_type;Iterator(U p_data, bool reverse = false) : m_p_data_(p_data) {m_it_ = m_p_data_->m_data_.begin();}void First() {m_it_ = m_p_data_->m_data_.begin();}void Next() {m_it_++;}bool IsDone() {return (m_it_ == m_p_data_->m_data_.end());}iter_type Current() {return m_it_;}private:U m_p_data_;iter_type m_it_;
};template <class T>
class Container {friend class Iterator<T, Container>;public:void Add(T a) {m_data_.push_back(a);}Iterator<T, Container> CreateIterator() {return new Iterator<T, Container>(this);}private:std::vector<T> m_data_;
};class Data {public:Data(int a = 0) : m_data_(a) {}void set_data(int a) {m_data_ = a;}int data() {return m_data_;}private:int m_data_;
};void ClientCode() {std::cout << "________________Iterator with int______________________________________" << std::endl;Container<int> cont;for (int i = 0; i < 10; i++) {cont.Add(i);}Iterator<int, Container<int>> it = cont.CreateIterator();for (it->First(); !it->IsDone(); it->Next()) {std::cout << it->Current() << std::endl;}Container<Data> cont2;Data a(100), b(1000), c(10000);cont2.Add(a);cont2.Add(b);cont2.Add(c);std::cout << "________________Iterator with custom Class______________________________" << std::endl;Iterator<Data, Container<Data>> it2 = cont2.CreateIterator();for (it2->First(); !it2->IsDone(); it2->Next()) {std::cout << it2->Current()->data() << std::endl;}delete it;delete it2;
}int main() {ClientCode();return 0;
}

上述代碼 uml 類圖如下


4.注意事項


?? ? 迭代器模式 Iterator Pattern 使用時需要注意什么?

?? ?使用迭代器模式時,需要注意以下幾點:

?? ?1. 迭代器狀態的維護:

?? ? 迭代器對象需要維護當前遍歷的位置,確保每次調用 `next()` 方法都能返回下一個元素。
?? ? 迭代器對象需要處理遍歷結束的情況,例如在 `hasNext()` 方法中返回 `false`,或在 `next()` 方法中拋出異常。

?? ?2. 迭代器的類型:

?? ? 迭代器可以是內部迭代器,也稱為迭代器方法,它將遍歷邏輯封裝在集合類內部,例如 Java 中的 `forEach` 方法。
?? ? 迭代器可以是外部迭代器,它是一個獨立的類,負責遍歷集合,例如 Java 中的 `Iterator` 接口。

?? ?3. 迭代器的可復用性:

?? ? 迭代器對象通常是不可復用的,因為它們維護了遍歷狀態。
?? ? 如果需要多次遍歷同一個集合,需要創建新的迭代器對象。

?? ?4. 迭代器的并發訪問:

?? ? 如果多個線程同時訪問同一個迭代器對象,可能會導致數據不一致或異常。
?? ? 在并發環境中使用迭代器時,需要進行同步處理,例如使用鎖機制來保護迭代器對象。

?? ?5. 迭代器的性能:

?? ? 迭代器的性能取決于集合的類型和迭代器的實現方式。
?? ? 對于一些集合類型,例如鏈表,迭代器可能比直接訪問元素效率低。

?? ?6. 迭代器的靈活性:

?? ? 迭代器模式可以提供靈活的遍歷方式,例如正序、逆序、隨機訪問等。
?? ? 可以根據需要自定義迭代器,實現不同的遍歷邏輯。

?? ?總結:

?? ?迭代器模式是一種強大的設計模式,它可以簡化對集合的遍歷操作,并提供靈活的遍歷方式。在使用迭代器模式時,需要關注迭代器狀態的維護、類型、可復用性、并發訪問和性能等方面,以確保代碼的正確性和效率。

5.最佳實踐


在使用迭代器模式時,除了前面提到的需要注意的地方,還需要遵循以下經驗:

1. 明確迭代器職責

迭代器應該只負責遍歷集合,不應該包含其他操作,例如修改集合元素。
如果需要修改集合元素,應該使用專門的方法,而不是通過迭代器來實現。


2. 保持迭代器簡單

迭代器應該盡可能簡單易懂,避免過度設計。
迭代器應該只包含必要的操作,例如 hasNext()、next() 等。


3. 考慮迭代器的性能

如果需要頻繁遍歷集合,應該選擇性能較高的迭代器實現。
對于一些特殊類型的集合,例如鏈表,可能需要使用自定義迭代器來提高性能。


4. 避免迭代器中的副作用

迭代器不應該修改集合的狀態,例如添加或刪除元素。
如果需要修改集合,應該使用專門的方法,而不是通過迭代器來實現。


5. 使用迭代器模式的最佳實踐

優先使用語言提供的內置迭代器,例如 Java 中的 Iterator 接口。
如果需要自定義迭代器,應該遵循迭代器模式的規范,并提供必要的操作。
避免在迭代器中使用 break 或 continue 語句,因為它們會破壞迭代器的正常邏輯。


6. 迭代器與并發

在并發環境中使用迭代器時,需要格外小心,因為多個線程可能會同時訪問同一個迭代器對象。
如果需要在并發環境中使用迭代器,應該使用線程安全的迭代器實現,例如 Java 中的 ConcurrentIterator 接口。

6.總結

????????迭代器模式是一種非常實用的設計模式,它可以幫助我們簡化對集合的遍歷操作,并提高代碼的可讀性和可維護性。在使用迭代器模式時,遵循以上經驗可以幫助我們寫出更加健壯和高效的代碼。

7.行為模式匯總圖

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

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

相關文章

python猜數游戲限制次數

1、游戲規則 在這個游戲中&#xff0c;計算機會隨機生成一個1到100之間的整數&#xff0c;玩家需要在限定的次數內猜測這個數字是多少。如果玩家猜對了數字&#xff0c;游戲結束&#xff0c;玩家獲勝;如果玩家用完了所有的猜測次數仍然沒有猜對&#xff0c;游戲結束&#xff0…

Redis之內存管理過期、淘汰機制

1.Redis內存管理 我們的redis是一個內存型數據庫&#xff0c;我們的數據也都是放在內存中的&#xff0c;內存是有限的空間&#xff0c;當數據滿了之后&#xff0c;我們要怎么樣繼續保證redis的可用性呢?我們就需要采取點管理措施和機制來保證我們redis的可用性。 在redis.co…

一套saas模式云MES系統源碼,基于springboot+vue.js+uniapp開發

一套saas模式云MES系統源碼&#xff0c;基于springbootvue.jsuniapp開發 MES系統簡介 MES系統&#xff0c;即制造執行系統&#xff08;Manufacturing Execution System&#xff09;&#xff0c;是一種面向制造企業車間執行層的生產信息化管理系統。它位于上層的企業資源規劃&a…

Day01_CET4-Read synonymous substitutions

文章目錄 1.減少2.增加3.原因4.贊揚 1.減少 diminish v.減少 dwindle v.逐漸減少 lessen v.減少 slash v.削減 &#xff08;cut down&#xff09; slump v.暴跌&#xff1b;n.衰退 recession n.衰退 &#xff08;economic disruption&#xff09; lower v.降低 depress…

應用案例|精密制造中使用復合機器人得到顯著提升

精密制造行業對設備的精度、穩定性和效率要求極高&#xff0c;而復合機器人憑借其多功能性、高度靈活性和精準控制能力&#xff0c;正逐漸成為該領域的新寵。以下是一個富唯智能復合機器人在精密制造中的應用案例。 案例背景 某知名汽車零部件制造企業&#xff0c;專注于生產…

【JS】并發控制

需求 控制網絡請求并發數控制并發按順序返回結果 碼 /** * 控制并發 * param {Function} fn 邏輯處理函數 * param {Array} arr 發送的數據 * param {Number} [max3] 并發數 默認3 * param {Number} [orderfalse] 按順序返回執行結果 默認false * param {Number} [retry1] 重試…

vue項目集成螢石云在Web系統中實現實時攝像頭監控及控制功能

需求 需求&#xff1a; 開發人員在產線上放置一個螢石攝像頭&#xff0c;前端在可視化大屏上實時監控&#xff0c;且控制左右上下功能。 效果 螢石云接入web前期準備工作 閱讀螢石云API文檔&#xff1a;螢石云開放平臺開發者文檔 閱讀螢石云控制API文檔&#xff1a;螢石云攝…

【錯題集-編程題】dd 愛旋轉(模擬)

牛客對應題目鏈接&#xff1a;dd愛旋轉 (nowcoder.com) 一、分析題目 模擬題&#xff0c;但是需要不能直接無腦模擬&#xff0c;要思考?下規律。 順時針旋轉 180&#xff1a;行變換 列變換行變換、列變換的順序顛倒不會有影響行變換的次數是個數相當于不變 二、代碼 #includ…

設計模式--》 裝飾模式的應用

裝飾模式的定義&#xff1a; 裝飾模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許你動態地給一個對象添加一些額外的職責。就增加功能來說&#xff0c;裝飾模式相比生成子類更為靈活。 何時應用裝飾模式&#xff1f; 1.當需要動態地給…

《C語言深度解剖》(15):動態內存管理和柔性數組

&#x1f921;博客主頁&#xff1a;醉竺 &#x1f970;本文專欄&#xff1a;《C語言深度解剖》 &#x1f63b;歡迎關注&#xff1a;感謝大家的點贊評論關注&#xff0c;祝您學有所成&#xff01; ??&#x1f49c;&#x1f49b;想要學習更多C語言深度解剖點擊專欄鏈接查看&…

k8s中的集群調度

文章目錄 k8s中的集群調度Pod 創建流程 通過指定節點來創建pod所在的node節點通過標簽來指定pod創建在哪個節點上pod 的親和性Pod的親和性和反親和性親和性&#xff08;Affinity&#xff09;反親和性&#xff08;Anti-Affinity&#xff09; 污點與容忍污點&#xff08;Taint&am…

Spring Cache入門詳解

一、概述 1.1緩存介紹 Spring提供了一套cache緩存抽象(注解/接口)&#xff0c;使基于spring緩存的使用與實現解耦 默認實現&#xff0c;Spring JDK ConcurrentMap-based Cache第三方實現&#xff0c;caffeine/Ehcache/Redis等 https://docs.spring.io/spring-framework/do…

Postman快捷功能-快速填寫請求頭

大家好&#xff0c;之前給大家分享關于 Postman 工具的基礎使用&#xff0c;今天給大家介紹一個快捷功能&#xff0c;可以一定程度提高我們使用 Postman 工具的效率&#xff0c;在我們進行接口測試時&#xff0c;幾乎每個接口都需要填寫 Headers&#xff0c;且 Headers 中的參數…

【ai】livekit服務本地開發模式2:模擬1個發布者

是一個會議用軟件:LiveKit is an open source project that provides scalable, multi-user conferencing based on WebRTC. It’s designed to provide everything you need to build real-time video audio data capabilities in your applications.LiveKit’s server is wr…

【Python】 Django 框架如何支持百萬級日訪問量

基本原理 Django 是一個高級的 Python Web 框架&#xff0c;它鼓勵快速開發和干凈、實用的設計。Django 遵循 MVC&#xff08;模型-視圖-控制器&#xff09;設計模式&#xff0c;允許開發者通過編寫更少的代碼來構建高質量的 Web 應用程序。Django 自帶了許多內置功能&#xf…

發現沒:隨便搞個B端頁面,就想在客戶那里過關,難啦。

客戶對B端界面要求越來越高的原因可以有以下幾點&#xff1a; 用戶體驗要求提升&#xff1a;隨著用戶對移動應用和網頁的使用經驗增加&#xff0c;他們對于界面的交互、流暢性和易用性要求也越來越高。他們希望能夠在使用B端應用時&#xff0c;能夠快速、方便地完成任務&#…

2024年華為OD機試真題-文本統計分析-C++-OD統一考試(C卷D卷)

題目描述: 有一個文件, 包含以一定規則寫作的文本, 請統計文件中包含的文本數量 規則如下 1. 文本以";"分隔,最后一條可以沒有";",但空文本不能算語句,比如"COMMAND A; ;"只能算一條語句. 注意, 無字符/空白字符/制表符都算作"空&qu…

設計模式詳解(六):適配器模式——Adapter

目錄導航 適配器模式及其作用現實生活舉例 適配器模式的好處適配器模式的實現關系圖實現步驟 適配器模式的適用場景適配器模式示例 適配器模式及其作用 適配器模式是一種結構型設計模式。所謂結構型是指在代碼結構方面的設計模式。適配器模式作為中間層&#xff0c;可以讓交互…

Vue3 圖片或視頻下載跨域或文件損壞的解決方法

Vue3 圖片或視頻下載跨域或文件損壞的解決方法 修改跨域配置文件下載方法 修改跨域配置文件 修改vite.config.ts文件proxy里面寫跨域地址&#xff0c;如下圖&#xff0c;圖片地址就是我們要跨域的目標地址&#xff1a; 下載方法 如下就是我取消上面那句后的報錯 然后調用兩…

【C++風云錄】C++與智能交通:智能交通系統與車聯網

解鎖C的力量&#xff1a;在智能交通系統與車聯網中使用關鍵庫 前言 本文關注于C在智能交通系統與車聯網中的應用&#xff0c;并提供了五個常見庫的簡介和使用方法。這些庫包括&#xff1a;Veins, SUMO-GUI, OMNeT, NS-3和PLEXE&#xff0c;每個庫都有其獨特的功能和優點&…