1. Apa Itu Pola Iterator
Pola iterator adalah pola desain perilaku yang menyediakan metode seragam untuk menelusuri elemen-elemen sebuah objek agregat tanpa mengekspos representasi internal dari objek agregat tersebut.
2. Karakteristik dan Keuntungan dari Pola Iterator
Karakteristik dan keuntungan dari pola iterator adalah sebagai berikut:
- Dapat menyembunyikan struktur internal dari objek koleksi, yang memisahkan algoritma penelusuran dari objek koleksi.
- Menyediakan cara standar untuk menelusuri berbagai jenis objek koleksi.
- Meringankan kode klien, membuatnya lebih jelas dan ringkas.
- Dapat menyediakan berbagai implementasi iterator untuk beradaptasi dengan berbagai kebutuhan penelusuran.
3. Contoh Aplikasi Praktis dari Pola Iterator
Pola iterator memiliki banyak aplikasi praktis, seperti:
- Penelusuran hasil kueri basis data.
- Penelusuran file dan folder dalam sistem file.
- Penelusuran elemen dalam sebuah koleksi.
4. Implementasi Pola Iterator di Golang
4.1 Diagram Kelas UML

4.2 Pengantar Contoh
Dalam diagram kelas UML di atas, kita memiliki dua peran utama: Iterator dan Collection.
- Iterator mendefinisikan antarmuka untuk menelusuri objek koleksi, termasuk metode
HasNext()untuk menentukan apakah ada elemen lain dan metodeNext()untuk mendapatkan elemen berikutnya. - ConcreteIterator adalah kelas implementasi khusus dari Iterator, yang mengimplementasikan metode
HasNext()danNext(). - Collection mendefinisikan antarmuka untuk membuat objek iterator, dengan metode
CreateIterator(). - ConcreteCollection adalah kelas implementasi khusus dari Collection, yang mengimplementasikan metode
CreateIterator().
4.3 Langkah Implementasi
Selanjutnya, kita akan mengimplementasikan pola Iterator di Golang langkah demi langkah.
4.3.1 Mendefinisikan Antarmuka Iterator dan Kelas Concrete Iterator
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 Mendefinisikan Antarmuka Objek Dapat Diiterasi dan Kelas Objek Dapat Diiterasi Concrete
type Collection interface {
CreateIterator() Iterator
}
type ConcreteCollection struct {
items []interface{}
}
func (c *ConcreteCollection) CreateIterator() Iterator {
return &ConcreteIterator{
collection: c,
index: 0,
}
}
4.3.3 Mengimplementasikan Logika Pembuatan Iterator di Kelas Objek Dapat Diiterasi
func main() {
collection := &ConcreteCollection{
items: []interface{}{"Golang", "Python", "Java"},
}
iterator := collection.CreateIterator()
for iterator.HasNext() {
item := iterator.Next()
fmt.Println(item)
}
}
Menjalankan kode di atas akan menghasilkan output berikut:
Golang
Python
Java
Pada kode di atas, kita mendefinisikan kelas ConcreteCollection yang mengimplementasikan antarmuka Collection, dengan metodenya CreateIterator() mengembalikan objek iterator. Kami menggunakan objek iterator ini dalam fungsi main() untuk penelusuran.
4.4 Perluasan Langkah Implementasi: Menyederhanakan Implementasi Iterator dengan Menggunakan Fungsi Generator
Di Golang, kita dapat menyederhanakan implementasi iterator dengan menggunakan fungsi generator (yield). Berikut adalah contoh penggunaan fungsi generator:
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)
}
}
Pada kode di atas, kita mendefinisikan fungsi GenerateItems() yang mengembalikan channel hanya untuk dibaca (<-chan), dan menggunakan yield untuk secara berurutan mengirimkan elemen-elemen ke channel dalam fungsi ini. Pada fungsi main(), kita menggunakan range untuk menelusuri channel hanya untuk dibaca ini dan mengeluarkan nilai elemen.
Dengan cara ini, kita telah menyederhanakan implementasi iterator dengan menggunakan fungsi generator.