Menu
CoddyTech

Pola Iterator

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 76 dari 87.

Iterator Pattern adalah pola desain perilaku yang menyediakan cara untuk mengakses elemen koleksi secara berurutan tanpa mengekspos struktur dasarnya. Baik kamu menggunakan array, linked list, maupun tree, iterator menyediakan cara yang seragam untuk menelusuri elemen-elemennya.

Pola ini memisahkan logika penelusuran dari koleksi itu sendiri. Pola ini memiliki dua komponen utama: antarmuka Iterator yang mendefinisikan method untuk menelusuri elemen, dan Iterable (atau Aggregate) yang membuat iterator untuk koleksinya:

interface Iterator<T> {
    boolean hasNext();
    T next();
}

interface Container<T> {
    Iterator<T> createIterator();
}

class BookShelf implements Container<String> {
    private String[] books;
    private int count = 0;
    
    public BookShelf(int size) {
        books = new String[size];
    }
    
    public void addBook(String book) {
        books[count++] = book;
    }
    
    public Iterator<String> createIterator() {
        return new BookIterator();
    }
    
    private class BookIterator implements Iterator<String> {
        private int index = 0;
        
        public boolean hasNext() {
            return index < count;
        }
        
        public String next() {
            return books[index++];
        }
    }
}

Iterator mempertahankan status penelusurannya sendiri, sehingga beberapa iterator dapat menelusuri collection yang sama secara terpisah. Client menggunakan iterator tanpa perlu mengetahui cara collection menyimpan datanya:

BookShelf shelf = new BookShelf(3);
shelf.addBook("Design Patterns");
shelf.addBook("Clean Code");

Iterator<String> iterator = shelf.createIterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

Interface bawaan Java Iterable dan Iterator mengikuti pola yang sama persis, itulah sebabnya kamu bisa menggunakan for loop yang disempurnakan dengan class apa pun yang mengimplementasikan Iterable. Pola Iterator sangat penting saat kamu perlu menyediakan beberapa cara penelusuran atau menyembunyikan struktur internal yang kompleks dari kode client.

challenge icon

Tantangan

Mudah

Mari buat sistem playlist menggunakan Iterator Pattern! Kamu akan membuat playlist musik yang menyimpan lagu dan menyediakan iterator khusus untuk menelusurinya secara berurutan, tanpa mengungkap cara lagu disimpan secara internal. Ini adalah kasus penggunaan yang tepat untuk Iterator Pattern, sehingga pengguna dapat menelusuri koleksimu melalui antarmuka yang rapi dan seragam.

Kamu akan mengatur kodemu dalam empat file:

  • Iterator.java: Definisikan antarmuka Iterator<T> generik dengan dua method: hasNext() yang mengembalikan boolean untuk menunjukkan apakah masih ada elemen, dan next() yang mengembalikan elemen berikutnya dengan tipe T.
  • Playlist.java: Buat class agregat yang menyimpan lagu-lagumu. Playlist harus menyimpan lagu dalam array String dengan kapasitas tetap, yang diberikan ke konstruktor, dan mencatat jumlah lagu yang telah ditambahkan. Sertakan method addSong(String song) untuk menambahkan lagu ke playlist.

    Playlist-mu memerlukan method createIterator() yang mengembalikan Iterator<String>. Implementasikan ini dengan membuat inner class privat bernama PlaylistIterator yang mengimplementasikan antarmuka Iterator-mu. Iterator ini memiliki posisi indeks sendiri dan menelusuri array lagu, dengan mengembalikan setiap lagu secara berurutan.

  • Song.java: Buat class Song sederhana yang membungkus judul lagu. Class ini harus memiliki konstruktor yang menerima judul (String), method getTitle(), dan method toString() yang mengembalikan Playing: [title].
  • Main.java: Satukan sistem iteratormu! Kamu akan menerima satu input: daftar judul lagu yang dipisahkan koma (misalnya: Bohemian Rhapsody,Stairway to Heaven,Hotel California).

    Buat Playlist dengan kapasitas 10 lagu. Uraikan input dan tambahkan setiap judul lagu ke playlist. Kemudian, dapatkan iterator dari playlist dan gunakan untuk menelusuri semua lagu, dengan mencetak setiap lagu yang dibungkus dalam object Song (yang akan ditampilkan sebagai Playing: [title]).

    Setelah menelusuri semua lagu, cetak Playlist complete! pada baris baru.

Kamu akan menerima satu input: string berisi judul lagu yang dipisahkan koma.

Misalnya, dengan input Yesterday,Imagine,Let It Be, output-mu akan seperti ini:

Playing: Yesterday
Playing: Imagine
Playing: Let It Be
Playlist complete!

Perhatikan bagaimana class Main menggunakan method hasNext() dan next() dari iterator untuk menelusuri playlist tanpa mengetahui apa pun tentang struktur array yang mendasarinya. Iterator merangkum semua logika penelusuran, sehingga representasi internal koleksi tetap tersembunyi dari kode client!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Buat Playlist dengan kapasitas 10 lagu
        
        // TODO: Uraikan input (dipisahkan koma) dan tambahkan setiap judul lagu ke playlist
        
        // TODO: Dapatkan iterator dari playlist menggunakan createIterator()
        
        // TODO: Gunakan iterator untuk menelusuri semua lagu
        // Untuk setiap lagu, bungkus dalam object Song dan cetak
        
        // TODO: Cetak "Playlist complete!" setelah menelusuri semua lagu
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online