1. แบบแผน Iterator คืออะไร
แบบแผน iterator เป็นแบบแผนการออกแบบที่ให้วิธีการทั่วไปในการท่องเที่ยวสมาชิกของอ็อบเจกต์ชุดโดยไม่เปิดเผยโครงสร้างภายในของอ็อบเจกต์ชุด
2. ลักษณะและประโยชน์ของแบบแผน Iterator
ลักษณะและประโยชน์ของแบบแผน iterator มีดังนี้:
- สามารถซ่อนโครงสร้างภายในของอ็อบเจกต์คอลเล็คชันได้ โดยการแยกวิธีการท่องเที่ยวออกจากอ็อบเจกต์คอลเล็คชัน
- มีวิธีการมาตรฐานในการท่องเที่ยวอ็อบเจกต์คอลเลคชันประเภทต่าง ๆ
- ทำให้โค้ดของไคลเอ็นท่านเป็นมีความชัดเจนและกระชับกว่า
- สามารถให้การดำเนินการแบบ iterator ที่แตกต่างกันเพื่อใช้ปรับการท่องเที่ยวที่แตกต่างกันได้
3. ตัวอย่างการประยุกต์ใช้แบบแผน Iterator ในชีวิตจริง
แบบแผน iterator มีการประยุกต์ใช้ในหลายทั้ง หมดได้ เช่น:
- การท่องเที่ยวผลลัพธ์คิวรีฐานข้อมูล
- การท่องเที่ยวไฟล์และโฟลเดอร์ในระบบไฟล์
- การท่องเที่ยวอิทิมส์ในคอลเลคชัน
4. การประยุกต์ใช้แบบแผน Iterator ใน Golang
4.1 แผนภาพคลาส UML
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