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 bekerja dengan array, linked list, maupun tree, iterator memberimu cara yang seragam untuk menelusuri elemen-elemennya.
Pola ini memisahkan logika penelusuran dari koleksi itu sendiri. Pola ini melibatkan 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 menyimpan status penelusurannya sendiri, sehingga beberapa iterator dapat menelusuri koleksi yang sama secara mandiri. Client menggunakan iterator tanpa mengetahui cara koleksi 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 persis ini, sehingga kamu bisa menggunakan for-loop yang disempurnakan dengan class apa pun yang mengimplementasikan Iterable. Iterator Pattern penting saat kamu perlu menyediakan beberapa cara penelusuran atau menyembunyikan struktur internal yang kompleks dari kode client.
Tantangan
MudahMari kita buat sistem playlist menggunakan Pola Iterator! Kamu akan membuat playlist musik yang menyimpan lagu dan menyediakan iterator khusus untuk menelusurinya secara berurutan, tanpa mengungkapkan cara lagu disimpan secara internal. Ini adalah kasus penggunaan yang tepat untuk Pola Iterator, yang memungkinkan pengguna menelusuri koleksimu melalui antarmuka yang rapi dan seragam.
Kamu akan mengatur kodemu dalam empat file:
Iterator.java: Definisikan antarmuka generikIterator<T>dengan dua method:hasNext()yang mengembalikan boolean untuk menunjukkan apakah masih ada elemen, dannext()yang mengembalikan elemen berikutnya bertipe T.Playlist.java: Buat class agregat yang menyimpan lagu-lagumu.Playlistmilikmu harus menyimpan lagu dalam array String dengan kapasitas tetap (diberikan ke constructor) dan mencatat jumlah lagu yang telah ditambahkan. Sertakan methodaddSong(String song)untuk menambahkan lagu ke playlist.Playlist milikmu memerlukan method
createIterator()yang mengembalikanIterator<String>. Implementasikan ini dengan membuat inner class privat bernamaPlaylistIteratoryang mengimplementasikan antarmuka Iterator-mu. Iterator ini menyimpan posisi indeksnya sendiri dan menelusuri array lagu, lalu mengembalikan setiap lagu secara berurutan.Song.java: Buat classSongsederhana yang membungkus judul lagu. Class ini harus memiliki constructor yang menerima judul (String), methodgetTitle(), dan methodtoString()yang mengembalikanPlaying: [title].Main.java: Satukan sistem iterator-mu! Kamu akan menerima satu input: daftar judul lagu yang dipisahkan koma (contohnya:Bohemian Rhapsody,Stairway to Heaven,Hotel California).Buat Playlist dengan kapasitas 10 lagu. Uraikan input dan tambahkan setiap judul lagu ke playlist. Kemudian, ambil 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.
Contohnya, 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 iterator hasNext() dan next() 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: Pisahkan input berdasarkan koma, lalu 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 lalu cetak object tersebut
// TODO: Cetak "Playlist complete!" setelah menelusuri semua lagu
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem Pembayaran9Generik
Pengantar GenerikClass GenerikMethod GenerikParameter Tipe BerbatasWildcard (?, extends, super)Ulasan: Wadah Generik12Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola IteratorLatihan sendiri: Compiler Java online