CodeBlanks Logo Icon CodeBlanks

Decorator

Decorator desenini öğrenirsin.

Decorator deseni

Decorator, bir nesneyi sarmalayarak davranış ekler. Sarmalayan sınıf, sarmalanan nesne ile aynı arayüzü uygular; böylece istemci farkı görmez. Birden çok decorator iç içe geçebilir.

Örnek: Coffee arayüzü, SimpleCoffee temel nesne. MilkDecorator içine bir Coffee alır ve maliyetine süt fiyatını ekler. new MilkDecorator(new SimpleCoffee()) ile sarmalanmış bir kahve oluşur. Kalıtım yerine sarmalama tercih edilir; böylece davranış çalışma anında eklenebilir.

İç içe decorator'lar

Decorator'lar iç içe geçebilir: new SugarDecorator(new MilkDecorator(new SimpleCoffee())). Her katman kendi katkısını ekler; sonuç, tüm katmanların maliyetlerinin toplamıdır.

Bu, kalıtım hiyerarşisinin şişmesini önler. Her yeni özellik için yeni bir alt sınıf yerine bağımsız bir decorator yazılır. İstemci, istediği katmanları seçerek nesneyi özelleştirir. Bu esneklik özellikle IO akışlarında (örneğin BufferedReader) yaygındır.

Uygulama Kahveye süt decorator'ı ekle

Bir Coffee arayüzü tanımla: int cost(). SimpleCoffee sınıfı bu arayüzü uygulasın ve cost 10 döndürsün. MilkDecorator sınıfı Coffee arayüzünü uygulasın; kurucu bir Coffee inner alsın, cost inner.cost() + 3 döndürsün. main içinde new MilkDecorator(new SimpleCoffee()) ile sarmala ve cost() sonucunu System.out.println ile yazdır.

Başlangıç kodu

Main.java
// Coffee arayüzünü ve SimpleCoffee sınıfını tanımla
// MilkDecorator ile sarmala
// main içinde toplam maliyeti yazdır

Örnek çözüm

Main.java
interface Coffee { int cost(); }

class SimpleCoffee implements Coffee {
    public int cost() { return 10; }
}

class MilkDecorator implements Coffee {
    private Coffee inner;
    public MilkDecorator(Coffee inner) { this.inner = inner; }
    public int cost() { return inner.cost() + 3; }
}

public class DecoratorDemo {
    public static void main(String[] args) {
        Coffee c = new MilkDecorator(new SimpleCoffee());
        System.out.println(c.cost());
    }
}

Beklenen çıktı

13

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Decorator sarmaladığı nesne ile neyi paylaşır?

  • Aynı arayüzü Doğru cevap
  • Alanları
  • Kurucuyu
  • Statik durumu

Açıklama: Decorator, sarmaladığı nesne ile aynı arayüzü uygular.

2 Decorator kavramlarını eşleştir

Kavram Anlamı
Coffee Ortak arayüz
SimpleCoffee Temel nesne
MilkDecorator Sarmalayıcı
inner.cost() İç katmana delege

3 Decorator kurucusunu tamamla

Soru
public MilkDecorator(____ inner) { this.inner = inner; }
Cevap
public MilkDecorator(Coffee inner) { this.inner = inner; }

Açıklama: Decorator, sarmalanan türü alır.

İleri seviye bölümündeki tüm dersler