Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Composite 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çin showDetails(String indent) ve toplam maaşı tamsayı olarak döndüren getSalary().
  • Employee.java: Bireysel çalışanları temsil eden yaprak sınıfını oluşturun. Bir Employee, 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. getSalary yö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. Bir Department, bir ada (String) sahiptir ve OrganizationComponent alt öğelerinin bir listesini tutar. Üye eklemek için add(OrganizationComponent component) yöntemine sahip olmalıdır. showDetails çağrıldığında [indent][name] Department yazdırır, ardından artırılmış girintiyle (iki boşluk ekleyerek) her alt öğe üzerinde showDetails çağrısı yapar. getSalary yö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: $195000

Aynı 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]
    }
}
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