Composite Design Pattern : Nesneleri Bileşik Yapılarda Yönetmek

Yunus Emre Ulusan
3 min readDec 23, 2023

Composite tasarım deseni, nesneleri hiyerarşik bir yapıda düzenlemenizi ve bu nesneler arasında ağaç benzeri ilişkiler oluşturmanızı sağlayan bir tasarım desenidir. Bu desen, tekil nesneler ile bunların bir araya gelerek oluşturduğu bileşik nesneler arasında bir denge kurarak yapının esnekliğini ve kullanımını artırır.

Gerçek hayatta, dosya sistemleri, şirket organizasyonları ve grafiksel kullanıcı arayüzleri gibi birçok yapı, Composite tasarım deseniyle modellenebilir. Örneğin, bir dosya sistemi içinde dosyalar ve klasörler bulunur. Klasörler, içinde başka klasörleri veya dosyaları barındırabilir. Bu hiyerarşik yapı, Composite deseniyle temsil edilebilir.

Yazılım dünyasında, bir dosya sistemi üzerinden bu deseni anlatmak gerekirse; her dosya ve klasör, “Component” arayüzünü uygular. Dosyalar, en alt düzeydeki yaprak nesnelerdir ve kendilerine özgü davranışları temsil ederler. Klasörler ise hem yaprak nesneleri hem de kendi içlerinde başka yaprak veya bileşik nesneleri barındırabilen nesnelerdir.

Diyelim ki bir dosya sistemi düşünüyorsunuz. Kök düğüm dosya sistemi olarak düşünülebilir ve içinde dosyalar veya klasörler gibi alt düğümler bulunur. Bu hiyerarşik yapıda, her dosya veya klasör, kendi içinde diğer dosyaları veya alt klasörleri içerebilir.

Örneğin, bir dosya sistemi için şöyle bir yapı olabilir:

- Ana Klasör
- Dosya 1
- Dosya 2
- Alt Klasör
- Alt Dosya 1
- Alt Dosya 2
- Dosya 3
// Component arayüzü, hem leaf (yaprak) hem de composite (bileşik) nesneler için davranışları tanımlar.
interface DosyaSistemiComponent {
void ls();
}

// Yaprak nesneler, hiyerarşideki en alttaki nesneleri temsil eder.
class Dosya implements DosyaSistemiComponent {
private String ad;

public Dosya(String ad) {
this.ad = ad;
}

@Override
public void ls() {
System.out.println(ad);
}
}

// Composite nesneler, hem yaprak nesneleri hem de kendi içinde diğer composite veya yaprak nesneleri içeren nesneleri temsil eder.
class Klasor implements DosyaSistemiComponent {
private String ad;
private List<DosyaSistemiComponent> icerik;

public Klasor(String ad) {
this.ad = ad;
this.icerik = new ArrayList<>();
}

public void dosyaEkle(DosyaSistemiComponent dosya) {
icerik.add(dosya);
}

@Override
public void ls() {
System.out.println(ad);
for (DosyaSistemiComponent dosya : icerik) {
dosya.ls();
}
}
}

public class AnaProgram {
public static void main(String[] args) {
// Dosya ve klasörleri oluştur
DosyaSistemiComponent dosya1 = new Dosya("Dosya 1");
DosyaSistemiComponent dosya2 = new Dosya("Dosya 2");
DosyaSistemiComponent altDosya1 = new Dosya("Alt Dosya 1");
DosyaSistemiComponent altDosya2 = new Dosya("Alt Dosya 2");
DosyaSistemiComponent altKlasor = new Klasor("Alt Klasör");

// Alt klasöre dosyaları ekle
((Klasor) altKlasor).dosyaEkle(altDosya1);
((Klasor) altKlasor).dosyaEkle(altDosya2);

// Ana klasöre dosya ve alt klasörü ekle
DosyaSistemiComponent anaKlasor = new Klasor("Ana Klasör");
((Klasor) anaKlasor).dosyaEkle(dosya1);
((Klasor) anaKlasor).dosyaEkle(dosya2);
((Klasor) anaKlasor).dosyaEkle(altKlasor);

// Dosya sistemi yapısını göster
anaKlasor.ls();
}
}

Composite tasarım desenini kullanarak bir dosya sistemi yapısını temsil ediyor. Dosyalar yaprak nesneleri temsil ederken klasörler ise hem yaprak nesneleri hem de kendi içinde başka yaprak veya bileşik nesneleri içerebilen nesneleri temsil eder.

Bu desen, aynı tipteki nesneler arasında hiyerarşik bir yapı oluştururken tek bir nesne gibi davranmamızı sağlar, böylece kodun daha esnek ve modüler olmasına olanak tanır.

Gerçek hayattan bir örnek verecek olursak;
Örneğin, bir şirket organizasyonu:

-Şirket
-İnsan Kaynakları
- Çalışan 1
- Çalışan 2
- Eğitim Departmanı
- Eğitmen 1
- Eğitmen 2
Pazarlama
- Pazarlama Müdürü
- Reklam Ekibi
- Reklam Uzmanı 1
- Reklam Uzmanı 2
Satış
- Satış Temsilcisi 1
- Satış Temsilcisi 2

Burada, şirket bir bileşik nesne olabilir. Her departman (İnsan Kaynakları, Pazarlama, Satış) bir bileşik nesne veya klasör gibi olabilir. Her departman altında çalışanlar veya alt departmanlar (Eğitim Departmanı, Reklam Ekibi) bulunabilir ve bu alt departmanlar da kendi içlerinde çalışanları içerebilir.

Bu örnekte, Composite tasarım desenini kullanarak bir şirket organizasyonunu modelleyebilirsiniz. Şirket, departmanları ve departmanlar içindeki çalışanları temsil eden bir yapı oluşturulabilir. Bu sayede, her seviyede departmanları veya çalışanları yönetmek daha kolay ve tutarlı olabilir.

Yararlandığım kaynaklar :

1- RefactoringGuru

2- GeeksForGeeks

3- Pentablog

--

--