Yineleyici Kalıbı
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 76 / 87.
Iterator Kalıbı, temel yapısını açığa çıkarmadan bir koleksiyonun öğelerine sıralı olarak erişmenin bir yolunu sağlayan davranışsal bir tasarım kalıbıdır. Bir dizi, bağlı liste veya ağaçla çalışıyor olmanız fark etmeksizin, yineleyici öğeler arasında gezinmek için size standart bir yol sunar.
Bu desen, dolaşma mantığını koleksiyonun kendisinden ayırır. İki ana bileşen içerir: öğeler arasında dolaşmak için yöntemleri tanımlayan bir Iterator arayüzü ve koleksiyonu için yineleyiciler oluşturan bir Iterable (veya Aggregate):
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++];
}
}
}Yineleyici, kendi gezinme durumunu koruyarak birden fazla yineleyicinin aynı koleksiyonda birbirinden bağımsız şekilde gezinmesine olanak tanır. İstemciler, koleksiyonun verilerini nasıl depoladığını bilmeden yineleyiciyi kullanır:
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());
}Java'nın yerleşik Iterable ve Iterator arayüzleri tam olarak bu kalıbı izler; bu nedenle Iterable uygulayan herhangi bir sınıfla gelişmiş for döngülerini kullanabilirsiniz. İteratör Kalıbı, birden fazla gezinme yöntemi sağlamanız veya karmaşık iç yapıları istemci kodundan gizlemeniz gerektiğinde temeldir.
Görev
KolayIterator Pattern kullanarak bir çalma listesi sistemi oluşturalım! Şarkıları depolayan ve şarkıların dahili olarak nasıl depolandığını açığa çıkarmadan bunlar arasında sıralı şekilde gezinmek için özel bir iterator sağlayan bir müzik çalma listesi oluşturacaksın. Bu, Iterator Pattern için mükemmel bir kullanım alanıdır ve kullanıcıların koleksiyonunda temiz, tek tip bir arayüz aracılığıyla gezinmesini sağlar.
Kodunu dört dosyaya ayıracaksın:
Iterator.java: İki metoda sahip genericIterator<T>interface'ini Define et: daha fazla öğenin exist olup olmadığını belirten bir boolean döndürenhasNext()ve T türündeki bir sonraki öğeyi döndürennext().Playlist.java: Şarkılarını holds eden Aggregate class'ı Create et.Playlist, şarkıları sabit bir capacity değerine sahip bir String array içinde depolamalı (bu değer constructor'a geçirilir) ve kaç şarkının added olduğunu izlemelidir. Şarkıları çalma listesine eklemek için biraddSong(String song)metodu ekle.Playlist'in bir
createIterator()metodu olmalıdır; bu metot birIterator<String>döndürür. Bunu,PlaylistIteratoradlı private bir inner class oluşturarak ve bu sınıfın Iterator interface'ini implements etmesini sağlayarak Implement et. Bu inner iterator kendi index konumunu korur ve songs array'i boyunca gezinerek her şarkıyı sırasıyla döndürür.Song.java: Bir şarkı başlığını saran basit birSongclass'ı Create et. Başlığı (String) alan bir constructor, birgetTitle()metodu vePlaying: [title]döndüren birtoString()metodu olmalıdır.Main.java: Iterator sistemini bir araya getir! Bir input alacaksın: virgülle ayrılmış şarkı başlıkları listesi (örneğin:Bohemian Rhapsody,Stairway to Heaven,Hotel California).10 şarkı capacity'sine sahip bir Playlist Create et. Input'u ayrıştır ve her şarkı başlığını çalma listesine add et. Ardından çalma listesinden bir iterator al ve bunu tüm şarkılar arasında gezinmek için kullan; her birini bir Song nesnesiyle sarılmış olarak yazdır (bu nesne
Playing: [title]şeklinde görüntülenir).Tüm şarkılar arasında iterating yaptıktan sonra yeni bir satıra
Playlist complete!yazdır.
Bir input alacaksın: virgülle ayrılmış bir şarkı başlıkları string'i.
Örneğin, input Yesterday,Imagine,Let It Be olduğunda çıktın şöyle olur:
Playing: Yesterday
Playing: Imagine
Playing: Let It Be
Playlist complete!Main class'ının, temel array yapısı hakkında hiçbir şey bilmeden çalma listesinde gezinmek için iterator'ın hasNext() ve next() metotlarını nasıl kullandığına dikkat et. Iterator, tüm gezinme mantığını encapsulate ederek koleksiyonun dahili gösterimini istemci kodundan gizli tutar!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: 10 şarkı kapasiteli bir Playlist oluştur
// TODO: Girdiyi (virgülle ayrılmış) ayrıştır ve her şarkı başlığını playlist'e ekle
// TODO: createIterator() kullanarak playlist'ten bir iterator elde et
// TODO: Tüm şarkıları dolaşmak için iterator'ı kullan
// Her şarkı için, onu bir Song nesnesine sar ve yazdır
// TODO: Print "Playlist complete!" after iterating through all songs
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi