2023-08-25|閱讀時間 ‧ 約 5 分鐘

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

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. 提供統一的接口:不同的集合可以使用相同的迭代器接口,使代碼更為整潔和可重用。


小結

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

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.