1. แบบแผน Iterator คืออะไร

แบบแผน iterator เป็นแบบแผนการออกแบบที่ให้วิธีการทั่วไปในการท่องเที่ยวสมาชิกของอ็อบเจกต์ชุดโดยไม่เปิดเผยโครงสร้างภายในของอ็อบเจกต์ชุด

2. ลักษณะและประโยชน์ของแบบแผน Iterator

ลักษณะและประโยชน์ของแบบแผน iterator มีดังนี้:

  • สามารถซ่อนโครงสร้างภายในของอ็อบเจกต์คอลเล็คชันได้ โดยการแยกวิธีการท่องเที่ยวออกจากอ็อบเจกต์คอลเล็คชัน
  • มีวิธีการมาตรฐานในการท่องเที่ยวอ็อบเจกต์คอลเลคชันประเภทต่าง ๆ
  • ทำให้โค้ดของไคลเอ็นท่านเป็นมีความชัดเจนและกระชับกว่า
  • สามารถให้การดำเนินการแบบ iterator ที่แตกต่างกันเพื่อใช้ปรับการท่องเที่ยวที่แตกต่างกันได้

3. ตัวอย่างการประยุกต์ใช้แบบแผน Iterator ในชีวิตจริง

แบบแผน iterator มีการประยุกต์ใช้ในหลายทั้ง หมดได้ เช่น:

  • การท่องเที่ยวผลลัพธ์คิวรีฐานข้อมูล
  • การท่องเที่ยวไฟล์และโฟลเดอร์ในระบบไฟล์
  • การท่องเที่ยวอิทิมส์ในคอลเลคชัน

4. การประยุกต์ใช้แบบแผน Iterator ใน Golang

4.1 แผนภาพคลาส UML

แบบแผน Iterator ใน Golang

4.2 การแนะนำตัวอย่าง

ในแผนภาพคลาส UML ที่กล่าวมา เรามีบทบาทหลัก สองอย่าง ได้แก่ Iterator และ Collection

  • Iterator จะกล่าวถึงอินเทอร์เฟซที่ใช้ในการท่องเที่ยวอ็อบเจกต์คอลเลคชัน รวมถึงเมธอด HasNext() เพื่อตรวจสอบว่ามีอียูซต่อไปหรือไม่ และเมธอด Next() เพื่อให้ข้อมูลอินเทอร์เฟซต่อไป

  • ConcreteIterator เป็นคลาสการประยุกต์ในอินเทอเฟซได้รับการจำกัด เพื่อการที่จะให้มีการประมวลแต่ละเมธอด

  • Collection กำหนดอินเทอเฟซสำหรับการสร้างอ็อบเจกต์ Iterator ด้วยเมธอด CreateIterator()

  • ConcreteCollection เป็นคลาสการประยุกต์ใน Collection โดยจะมีการแพร่หลายอินเทอเฟซ Iterator โดยใช้เมธอด CreateIterator()

4.3 ขั้นตอนการประยุกต์ใช้

ต่อไป เราจะประยุกต์ใช้แบบแผน iterator ใน Golang ขั้นตอนต่อไปมีดังนี้

4.3.1 กำหนดอินเทอเฟซ Iterator และ Concrete Iterator Class

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

type ConcreteIterator struct {
    collection *ConcreteCollection
    index      int
}

func (it *ConcreteIterator) HasNext() bool {
    if it.index < len(it.collection.items) {
        return true
    }
    return false
}

func (it *ConcreteIterator) Next() interface{} {
    if it.HasNext() {
        item := it.collection.items[it.index]
        it.index++
        return item
    }
    return nil
}

4.3.2 กำหนดอินเทอเฟซอ็อบเจกต์ที่สามารถท่องเที่ยวได้ และ Concrete Iterable Object Class

type Collection interface {
    CreateIterator() Iterator
}

type ConcreteCollection struct {
    items []interface{}
}

func (c *ConcreteCollection) CreateIterator() Iterator {
    return &ConcreteIterator{
        collection: c,
        index:      0,
    }
}

4.3.3 การประมวลจำเสอ็อบเจกต์ที่สามารถท่องเที่ยวได้ในคลาสอ็อบเจกต์ที่สามารถท่องเที่ยวได้

func main() {
    collection := &ConcreteCollection{
        items: []interface{}{"Golang", "Python", "Java"},
    }

    iterator := collection.CreateIterator()
    for iterator.HasNext() {
        item := iterator.Next()
        fmt.Println(item)
    }
}

การรันโค้ดข้างต้นจะทำให้มีผลลัพธ์ดังนี้:

Golang
Python
Java

ในโค้ดข้างต้น เรากำหนดคลาส ConcreteCollection ที่ประมวลตามอินเทอเฟส Collection โดยมีเมธอด CreateIterator() เพื่อให้ได้อ็อบเจกต์แบบ iterator นี้ ในฟังก์ชัน main() นั้นเราใช้อ็อบเจกต์ iterator นี้ ในการท่องเที่ยว

4.4 ขั้นตอนการนำมาใช้: การประมวลผล Iterator โดยการใช้ Generator Function เพื่อความเรียบง่าย

ใน Golang, เราสามารถทำให้การประมวลผล Iterator มีความง่ายดายขึ้นโดยใช้ generator function (yield) ต่อไปนี้คือตัวอย่างการใช้ generator function:

func GenerateItems() <-chan interface{} {
    items := []interface{}{"Golang", "Python", "Java"}

    out := make(chan interface{})
    go func() {
        defer close(out)
        for _, item := range items {
            out <- item
        }
    }()
    return out
}

func main() {
    for item := range GenerateItems() {
        fmt.Println(item)
    }
}

ในโค้ดข้างต้น เราได้กำหนดฟังก์ชัน GenerateItems() ที่ส่งค่ากลับเป็นช่องทางที่สามารถอ่านได้ (<-chan) และใช้ yield เพื่อส่งองค์ประกอบต่าง ๆ ไปยังช่องทางภายในฟังก์ชันนี้ ในฟังก์ชัน main() เราใช้ range เพื่อทำการสแกนช่องทางที่สามารถอ่านได้นี้ และแสดงค่าขององค์ประกอบ

ด้วยวิธีนี้ เราได้ทำให้การสร้าง Iterator มีความง่ายขึ้นโดยการใช้ generator function