Yineleyici Kalıbı
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 76 / 87.
Yineleyici Deseni, bir koleksiyonun temel yapısını açığa çıkarmadan öğelerine sıralı olarak erişmenin bir yolunu sunan davranışsal bir tasarım desenidir. Bir dizi, bağlı liste veya ağaçla çalışıyor olmanız fark etmeksizin, yineleyici öğeler arasında gezinmek için tek tip bir yol sunar.
Desen, dolaşım mantığını koleksiyonun kendisinden ayırır. İki ana bileşenden oluşur: öğeler arasında dolaşmaya yönelik 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 dolaşım durumunu koruyarak birden fazla yineleyicinin aynı koleksiyonda birbirinden bağımsız olarak gezinmesini sağlar. İstemciler, koleksiyonun verilerini nasıl sakladığı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 bu kalıbı aynen izler; bu nedenle Iterable uygulayan herhangi bir sınıfla gelişmiş for döngülerini kullanabilirsin. Yineleyici Kalıbı, birden fazla dolaşma yöntemi sunman veya karmaşık iç yapıları istemci kodundan gizlemen gerektiğinde önemlidir.
Görev
KolayIterator Deseni'ni kullanarak bir çalma listesi sistemi oluşturalım! Şarkıları depolayan ve şarkıların dahili olarak nasıl saklandığını açığa çıkarmadan bunların arasında sırayla gezinmek için özel bir yineleyici sağlayan bir müzik çalma listesi oluşturacaksın. Kullanıcıların koleksiyonunda temiz ve tutarlı bir arayüz üzerinden gezinmesini sağlayan Iterator Deseni için bu mükemmel bir kullanım örneğidir.
Kodunu dört dosyaya ayıracaksın:
Iterator.java: İki yöntemi olan genelIterator<T>arayüzünü tanımla: Daha fazla öğe 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ı tutan koleksiyon sınıfını oluştur.Playlistsınıfın, sabit kapasiteli (kurucuya geçirilen) bir String dizisinde şarkıları saklamalı ve kaç şarkı eklendiğini takip etmelidir. Çalma listesine şarkı eklemek için biraddSong(String song)yöntemi ekle.Playlistsınıfında birIterator<String>döndürencreateIterator()yöntemi bulunmalıdır. Bunu,Iteratorarayüzünü uygulayan vePlaylistIteratoradlı özel bir iç sınıf oluşturarak gerçekleştir. Bu iç yineleyici kendi indeks konumunu tutar ve şarkı dizisinde gezinerek her şarkıyı sırayla döndürür.Song.java: Bir şarkı başlığını saran basit birSongsınıfı oluştur. Başlığı (String) alan bir kurucusu, birgetTitle()yöntemi vePlaying: [title]döndüren birtoString()yöntemi olmalıdır.Main.java: Yineleyici sistemini bir araya getir! Tek bir girdi alacaksın: virgülle ayrılmış şarkı başlıkları listesi (örneğin:Bohemian Rhapsody,Stairway to Heaven,Hotel California).10 şarkı kapasiteli bir
Playlistoluştur. Girdiyi ayrıştır ve her şarkı başlığını çalma listesine ekle. Ardından çalma listesinden bir yineleyici al ve tüm şarkılarda gezinmek için bu yineleyiciyi kullan; her şarkıyı birSongnesnesine sarılmış olarak yazdır (bu nesnePlaying: [title]şeklinde görüntülenir).Tüm şarkılarda yineleme yaptıktan sonra yeni bir satıra
Playlist complete!yazdır.
Tek bir girdi alacaksın: virgülle ayrılmış şarkı başlıklarından oluşan bir dize.
Örneğin, girdi Yesterday,Imagine,Let It Be olduğunda çıktın şöyle olur:
Playing: Yesterday
Playing: Imagine
Playing: Let It Be
Playlist complete!Main sınıfının, temel dizi yapısı hakkında hiçbir şey bilmeden çalma listesinde gezinmek için yineleyicinin hasNext() ve next() yöntemlerini nasıl kullandığına dikkat et. Yineleyici tüm gezinme mantığını kapsülleyerek 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ı çalma listesine ekle
// TODO: createIterator() kullanarak çalma listesinden bir iterator al
// TODO: Tüm şarkıları dolaşmak için iterator kullan
// Her şarkıyı bir Song nesnesine dönüştür ve yazdır
// TODO: Tüm şarkıları dolaştıktan sonra "Playlist complete!" yazdır
}
}
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