Golang - Design Pattern #12: 迭代器模式 ( Iterator)

更新於 發佈於 閱讀時間約 5 分鐘
raw-image
🔄 遍歷集合的方法 🔄

你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。


什麼是迭代器模式 (Iterator Pattern) ?

迭代器模式提供了一種方法來遍歷集合的元素,而不需要揭示該集合的底層結構。這意味著你可以輕鬆地更換底層數據結構,而不影響其它使用該集合的部分。


實際例子


📚 書店的書籍列表

想像一下,你正在設計一家書店的系統,其中有一個功能是列出所有的書籍。


package main

import "fmt"

type Book struct {
Title string
Author string
}

type BookList struct {
Books []*Book
}

type Iterator interface {
HasNext() bool
Next() *Book
}

type BookIterator struct {
index int
books []*Book
}

func (it *BookIterator) HasNext() bool {
return it.index < len(it.books)
}

func (it *BookIterator) Next() *Book {
if it.HasNext() {
book := it.books[it.index]
it.index++
return book
}
return nil
}

func main() {
harryPotter := &Book{"Harry Potter", "J.K. Rowling"}
lordOfTheRings := &Book{"Lord of the Rings", "J.R.R. Tolkien"}

myBookList := &BookList{
Books: []*Book{harryPotter, lordOfTheRings},
}

iterator := &BookIterator{books: myBookList.Books}

for iterator.HasNext() {
book := iterator.Next()
fmt.Printf("📖 %s by %s\n", book.Title, book.Author)
}
}

// Output:
// 📖 Harry Potter by J.K. Rowling
// 📖 Lord of the Rings by J.R.R. Tolkien


🍜 餐廳的菜單

現在想像一家餐廳的菜單,你可以使用迭代器模式來遍歷各種菜餚!


package main

import "fmt"

type Dish struct {
Name string
Price float64
}

type Menu struct {
Dishes []*Dish
}

type DishIterator struct {
index int
dishes []*Dish
}

func (it *DishIterator) HasNext() bool {
return it.index < len(it.dishes)
}

func (it *DishIterator) Next() *Dish {
if it.HasNext() {
d := it.dishes[it.index]
it.index++
return d
}
return nil
}

func main() {
steak := &Dish{"Steak", 100}
chicken := &Dish{"Chicken", 95}

menu := &Menu{
Dishes: []*Dish{steak, chicken},
}

iterator := &DishIterator{dishes: menu.Dishes}

for iterator.HasNext() {
dish := iterator.Next()
fmt.Printf("🍜 %s costs %.2f\n", dish.Name, dish.Price)
}
}

// Output:
// 🍜 Steak costs 100.00
// 🍜 Chicken costs 95.00


為何這麼有用?

  1. 分離集合與其遍歷:可以獨立地修改集合或迭代方式,不會影響到彼此。
  2. 提供統一的接口:不同的集合可以使用相同的迭代器接口,使代碼更為整潔和可重用。


小結

無論你在書店、餐廳還是你的日常生活中,迭代器模式都無處不在,幫助我們輕鬆地遍歷各種集合。下次當你在燒烤派對上或是選購你最愛的書籍時,請記得,迭代器模式正在背後默默地幫助你!🎉

留言
avatar-img
留言分享你的想法!
avatar-img
KH Huang的沙龍
37會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
KH Huang的沙龍的其他內容
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
在 Kotlin 程式語言中,for 迴圈非常便捷,能用於遍歷陣列、列表、集合等多種資料型別中的元素。這種遍歷方式不僅簡潔易讀,還能輕鬆處理集合內的元素。
Thumbnail
在 Kotlin 程式語言中,for 迴圈非常便捷,能用於遍歷陣列、列表、集合等多種資料型別中的元素。這種遍歷方式不僅簡潔易讀,還能輕鬆處理集合內的元素。
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
題目敘述 這題是一個經典的資料結構實作題,要求我們實作指定長度為k的環狀佇列。 請記得,佇列最重要的特質就是先進先出 First In First Out 又簡稱為 FIFO
Thumbnail
題目敘述 這題是一個經典的資料結構實作題,要求我們實作指定長度為k的環狀佇列。 請記得,佇列最重要的特質就是先進先出 First In First Out 又簡稱為 FIFO
Thumbnail
sort reverse count index copy len min max sum any all
Thumbnail
sort reverse count index copy len min max sum any all
Thumbnail
你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。
Thumbnail
你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。
Thumbnail
你有沒有試著畫出家族樹或公司組織架構圖呢?如果有,那你其實已經初步了解「組合模式 (Composite Pattern)」了!這種模式就是用來處理這類包含部分和整體的樹狀結構。這篇文章,我們就來深入探討它是如何運作的。
Thumbnail
你有沒有試著畫出家族樹或公司組織架構圖呢?如果有,那你其實已經初步了解「組合模式 (Composite Pattern)」了!這種模式就是用來處理這類包含部分和整體的樹狀結構。這篇文章,我們就來深入探討它是如何運作的。
Thumbnail
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
Thumbnail
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News