Kompozit Kalıbı
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 75 / 87.
Composite Pattern, nesneleri parça-bütün hiyerarşilerini temsil eden ağaç yapıları hâlinde oluşturmanızı sağlayan yapısal bir tasarım desenidir. İstemcilerin, ortak bir arayüz aracılığıyla tek tek nesnelere ve nesne bileşimlerine aynı şekilde davranmasına olanak tanır.
Bir dosya sistemini düşünün: Bir klasör, dosyaları ve diğer klasörleri içerebilir; bu klasörler de daha fazla dosya ve klasör içerebilir. Tek bir dosyayla ya da bütün bir klasör yapısıyla uğraşıyor olmanız fark etmeksizin, "get size" gibi işlemleri aynı şekilde gerçekleştirmek istersiniz. Bu desen bir Component arayüzü, Leaf nesnelerini (tek tek öğeler) ve Composite nesnelerini (alt öğeleri içeren kapsayıcılar) tanımlar:
interface FileComponent {
void display(String indent);
int getSize();
}
class File implements FileComponent {
private String name;
private int size;
public File(String name, int size) {
this.name = name;
this.size = size;
}
public void display(String indent) {
System.out.println(indent + name + " (" + size + "KB)");
}
public int getSize() {
return size;
}
}
class Folder implements FileComponent {
private String name;
private List<FileComponent> children = new ArrayList<>();
public Folder(String name) {
this.name = name;
}
public void add(FileComponent component) {
children.add(component);
}
public void display(String indent) {
System.out.println(indent + name + "/");
for (FileComponent child : children) {
child.display(indent + " ");
}
}
public int getSize() {
return children.stream().mapToInt(FileComponent::getSize).sum();
}
}Bileşik, işlemleri alt öğelerine devrederek özyinelemeli yapılara olanak tanır. İstemciler, bir yaprakla mı yoksa bir bileşikle mi çalıştıklarını bilmeden ağaçla etkileşim kurar:
Folder root = new Folder("Documents");
root.add(new File("resume.pdf", 150));
Folder photos = new Folder("Photos");
photos.add(new File("vacation.jpg", 2000));
root.add(photos);
root.display("");
System.out.println("Total: " + root.getSize() + "KB");Composite Pattern, kuruluş şemaları, kullanıcı arayüzü bileşenleri veya grupları ve bireyleri aynı şekilde ele almanız gereken menü sistemleri gibi hiyerarşileri temsil etmek için idealdir.
Görev
KolayComposite Pattern'ı kullanarak bir organizasyon şeması sistemi oluşturalım! Departmanların çalışanları ve diğer alt departmanları içerebildiği bir yapı oluşturacaksınız. Böylece tek bir çalışana veya bütün bir bölüme bakıyor olmanıza bakılmaksızın toplam maaşları hesaplayabilir ve hiyerarşiyi aynı şekilde görüntüleyebilirsiniz.
Kodunuzu dört dosyaya ayıracaksınız:
OrganizationComponent.java: Hem çalışanların hem de departmanların uygulayacağı bileşen arayüzünü tanımlayın. Bu arayüz iki yöntem bildirmelidir: bileşeni uygun girintilemeyle görüntülemek içinshowDetails(String indent)ve toplam maaşı tamsayı olarak döndürengetSalary().Employee.java: Bireysel çalışanları temsil eden yaprak sınıfını oluşturun. BirEmployee, her ikisi de kurucu aracılığıyla ayarlanan bir ada (String) ve maaşa (int) sahiptir.showDetailsçağrıldığında[indent][name]: $[salary]yazdırmalıdır.getSalaryyöntemi çalışanın maaşını döndürür.Department.java: Hem çalışanları hem de alt departmanları barındırabilen bileşik sınıfı oluşturun. BirDepartment, bir ada (String) sahiptir veOrganizationComponentalt öğelerinin bir listesini tutar. Üye eklemek içinadd(OrganizationComponent component)yöntemine sahip olmalıdır.showDetailsçağrıldığında[indent][name] Departmentyazdırır, ardından artırılmış girintiyle (iki boşluk ekleyerek) her alt öğe üzerindeshowDetailsçağrısı yapar.getSalaryyöntemi, tüm alt öğelerin maaşlarının toplamını döndürür.Main.java: Organizasyonunuzu oluşturun! Dört girdi alacaksınız: maaşlarıyla birlikte iki çalışan adı ve bir çalışanı olan bir alt departman adı.Kök olarak bir "Engineering" departmanı oluşturun. İlk iki ad/maaş çiftini kullanarak bu departmana iki çalışan ekleyin. Ardından üçüncü girdiyi kullanarak bir alt departman oluşturun, dördüncü ad/maaş çiftini kullanarak bu departmana bir çalışan ekleyin ve bu alt departmanı Engineering'e ekleyin.
Engineering departmanı üzerinde
showDetails("")çağrısı yapın, ardından toplam maaşıTotal Salary: $[amount]biçiminde yazdırın.
Girdileri şu sırayla alacaksınız: employee1 adı (String), employee1 maaşı (int), employee2 adı (String), employee2 maaşı (int), alt departman adı (String), employee3 adı (String), employee3 maaşı (int).
Örneğin girdiler Alice, 75000, Bob, 65000, QA, Charlie, 55000 olduğunda çıktınız şöyle olur:
Engineering Department
Alice: $75000
Bob: $65000
QA Department
Charlie: $55000
Total Salary: $195000Aynı showDetails ve getSalary yöntemlerinin tek bir çalışan veya iç içe alt departmanlar içeren bütün bir departman üzerinde çağrıldığında sorunsuz şekilde çalıştığına dikkat edin. Bileşik yapı özyinelemeyi otomatik olarak yönetir ve tüm hiyerarşiyi tutarlı biçimde ele almanızı sağlar!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String emp1Name = scanner.nextLine();
int emp1Salary = Integer.parseInt(scanner.nextLine());
String emp2Name = scanner.nextLine();
int emp2Salary = Integer.parseInt(scanner.nextLine());
String subDeptName = scanner.nextLine();
String emp3Name = scanner.nextLine();
int emp3Salary = Integer.parseInt(scanner.nextLine());
// TODO: Create the "Engineering" department as the root
// TODO: emp1 ve emp2 verilerini kullanarak Engineering'e iki çalışan oluştur ve ekle
// TODO: subDeptName kullanarak bir alt departman oluştur
// TODO: emp3 verisini kullanarak alt departmana bir çalışan oluştur ve ekle
// TODO: Alt departmanı Engineering'e ekle
// TODO: Call showDetails("") on the Engineering department
// TODO: Toplam maaşı şu formatta yazdır: Total Salary: $[amount]
}
}
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