迭代器模式是什麼 迭代器模式是一種行為設計模式, 讓你能在不暴露集合底層表現形式 (列表、 棧和樹等) 的情況下遍歷集合中所有的元素。 為什麼用迭代器模式 當集合背後為複雜的數據結構, 且你希望對客戶端隱藏其複雜性時(出於使用便利性或安全性的考慮),可以使用迭代器模式。迭代器封裝了與複雜數據結構進行 ...
迭代器模式是什麼
迭代器模式是一種行為設計模式, 讓你能在不暴露集合底層表現形式 (列表、 棧和樹等) 的情況下遍歷集合中所有的元素。
為什麼用迭代器模式
當集合背後為複雜的數據結構, 且你希望對客戶端隱藏其複雜性時(出於使用便利性或安全性的考慮),可以使用迭代器模式。迭代器封裝了與複雜數據結構進行交互的細節,為客戶端提供多個訪問集合元素的簡單方法。這種方式不僅對客戶端來說非常方便,而且能避免客戶端在直接與集合交互時執行錯誤或有害的操作, 從而起到保護集合的作用。
迭代器模式怎麼實現
迭代器模式的主要思想是將集合背後的迭代邏輯提取至不同的名為迭代器的對象中。迭代器提供了一種方法用於在集合上進行迭代。
collection.go 集合
package iterator
type collection interface {
createIterator() iterator
}
type user struct {
name string
age int
}
type userCollection struct {
users []*user
}
func (u *userCollection) createIterator() iterator {
return &userIterator{
users: u.users,
}
}
iterator.go 迭代器
package iterator
type iterator interface {
hasNext() bool
getNext() *user
}
type userIterator struct {
index int
users []*user
}
func (u *userIterator) hasNext() bool {
if u.index < len(u.users) {
return true
}
return false
}
func (u *userIterator) getNext() *user {
if u.hasNext() {
user := u.users[u.index]
u.index++
return user
}
return nil
}
example.go 客戶端調用示例
package iterator
import "fmt"
func Example() {
user1 := &user{
name: "a",
age: 30,
}
user2 := &user{
name: "b",
age: 20,
}
userCollection := &userCollection{
users: []*user{user1, user2},
}
iterator := userCollection.createIterator()
for iterator.hasNext() {
user := iterator.getNext()
fmt.Printf("User is %+v\n", user)
}
}
優點
- 單一職責原則。 通過將體積龐大的遍歷演算法代碼抽取為獨立的類, 你可對客戶端代碼和集合進行整理。
- 開閉原則。 你可實現新型的集合和迭代器並將其傳遞給現有代碼, 無需修改現有代碼。
缺點
- 如果你的程式只與簡單的集合進行交互, 應用該模式可能會矯枉過正。