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.
Tantangan
MudahMari 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 antarmukaIterator<T>generik dengan dua method:hasNext()yang mengembalikan boolean untuk menunjukkan apakah masih ada elemen, dannext()yang mengembalikan elemen berikutnya dengan tipe T.Playlist.java: Buat class agregat yang menyimpan lagu-lagumu.Playlistharus menyimpan lagu dalam array String dengan kapasitas tetap, yang diberikan ke konstruktor, dan mencatat jumlah lagu yang telah ditambahkan. Sertakan methodaddSong(String song)untuk menambahkan lagu ke playlist.Playlist-mu memerlukan methodcreateIterator()yang mengembalikanIterator<String>. Implementasikan ini dengan membuat inner class privat bernamaPlaylistIteratoryang mengimplementasikan antarmuka Iterator-mu. Iterator ini memiliki posisi indeks sendiri dan menelusuri array lagu, dengan mengembalikan setiap lagu secara berurutan.Song.java: Buat classSongsederhana yang membungkus judul lagu. Class ini harus memiliki konstruktor yang menerima judul (String), methodgetTitle(), dan methodtoString()yang mengembalikanPlaying: [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
}
}
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