Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Composite 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çin showDetails(String indent) ve toplam maaşı tamsayı olarak döndüren getSalary().
  • Employee.java: Tek tek çalışanları temsil eden yaprak sınıfı oluştur. Bir Employee, 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. getSalary metodu 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. Bir Department, bir ada (String) sahiptir ve OrganizationComponent alt bileşenlerinin listesini tutar. Üyeler eklemek için add(OrganizationComponent component) metoduna sahip olmalıdır. showDetails çağrıldığında [indent][name] Department yazdırır, ardından girintiyi artırarak (iki boşluk ekleyerek) her alt bileşende showDetails çağırır. getSalary metodu 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: $195000

Aynı 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]
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi