Kompozit Kalıbı
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 75 / 87.
Bileşik Desen, nesneleri birleştirerek parça-bütün hiyerarşilerini temsil eden ağaç yapıları oluşturmanı sağlayan yapısal bir tasarım desenidir. İstemcilerin, ortak bir arayüz aracılığıyla tekil nesneleri ve nesne bileşimlerini aynı şekilde ele almasına olanak tanır.
Bir dosya sistemini düşün: bir klasör dosyalar ve başka klasörler içerebilir; bunlar da daha fazla dosya ve klasör içerebilir. Tek bir dosyayla ya da tüm bir klasör yapısıyla ilgileniyor olsan da “boyutu al” gibi işlemleri aynı şekilde gerçekleştirmek istersin. Bu desen bir Bileşen arayüzü, Yaprak nesneleri (tek tek öğeler) ve Bileşik nesneler (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 bileşenlerine devrederek özyinelemeli yapılar oluşturulmasını sağlar. İ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");Bileşik Tasarım Deseni; organizasyon şemaları, kullanıcı arayüzü bileşenleri veya menü sistemleri gibi, grupları ve bireyleri aynı şekilde ele almanız gereken hiyerarşileri temsil etmek için idealdir.
Görev
KolayComposite Pattern kullanarak bir organizasyon şeması sistemi oluşturalım! Departmanların çalışanları ve başka alt departmanları içerebildiği bir yapı kuracaksın. Böylece ister tek bir çalışana ister tüm bir bölüme bakıyor ol, toplam maaşları hesaplayıp hiyerarşiyi tutarlı bir şekilde görüntüleyebileceksin.
Kodunu dört dosyaya ayıracaksın:
OrganizationComponent.java: Hem çalışanların hem de departmanların uygulayacağı bileşen arayüzünü tanımla. İki metot bildirmeli: bileşeni uygun girintilemeyle görüntülemek içinshowDetails(String indent)ve toplam maaşı tamsayı olarak döndürengetSalary().Employee.java: Tek tek çalışanları temsil eden yaprak sınıfı oluştur. BirEmployee, kurucu aracılığıyla belirlenen bir ada (String) ve maaşa (int) sahiptir.showDetailsçağrıldığında[indent][name]: $[salary]yazdırmalıdır.getSalarymetodu yalnızca ç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ştur. BirDepartment, bir ada (String) sahiptir veOrganizationComponentalt bileşenlerinin listesini tutar. Üyeler eklemek içinadd(OrganizationComponent component)metoduna sahip olmalıdır.showDetailsçağrıldığında[indent][name] Departmentyazdırır, ardından girintiyi artırarak (iki boşluk ekleyerek) her alt bileşendeshowDetailsçağırır.getSalarymetodu tüm alt bileşenlerin maaşları toplamını döndürür.Main.java: Organizasyonunu oluştur! Dört girdi alacaksın: maaşlarıyla birlikte iki çalışan adı ve bir çalışana sahip alt departman adı.Kök olarak bir "Engineering" departmanı oluştur. İlk iki ad/maaş çiftini kullanarak bu departmana iki çalışan ekle. Ardından üçüncü girdiyi kullanarak bir alt departman oluştur, dördüncü ad/maaş çiftini kullanarak bu departmana bir çalışan ekle ve bu alt departmanı Engineering'e ekle.
Engineering departmanında
showDetails("")çağır, ardından toplam maaşıTotal Salary: $[amount]biçiminde yazdır.
Girdileri şu sırayla alacaksın: employee1 adı (String), employee1 maaşı (int), employee2 adı (String), employee2 maaşı (int), alt departman adı (String), employee3 adı (String), employee3 maaşı (int).
Örneğin, Alice, 75000, Bob, 65000, QA, Charlie, 55000 girdileriyle çıktın şöyle olur:
Engineering Department
Alice: $75000
Bob: $65000
QA Department
Charlie: $55000
Total Salary: $195000Aynı showDetails ve getSalary metotlarının, ister tek bir çalışanda ister iç içe alt departmanlar içeren bütün bir departmanda çağrılsın, sorunsuz çalıştığına dikkat et. Bileşik yapı özyinelemeyi otomatik olarak yönetir ve tüm hiyerarşiyi tutarlı biçimde ele almana olanak tanır!
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: "Engineering" departmanını kök olarak oluştur
// TODO: emp1 ve emp2 verilerini kullanarak iki çalışan oluştur ve Engineering departmanına ekle
// TODO: subDeptName kullanarak bir alt departman oluştur
// TODO: emp3 verilerini kullanarak bir çalışan oluştur ve alt departmana ekle
// TODO: Alt departmanı Engineering departmanına ekle
// TODO: Engineering departmanında showDetails("") metodunu çağır
// TODO: Toplam maaşı şu biçimde 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