Java
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.
Örnek çözümü göster
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());
}
}
Kendini test et
-
Decorator sarmaladığı nesne ile neyi paylaşır?
- Aynı arayüzü
- Alanları
- Kurucuyu
- Statik durumu
Cevabı göster
Aynı arayüzü — Decorator, sarmaladığı nesne ile aynı arayüzü uygular.
-
Decorator kavramlarını eşleştir
- Coffee
- Ortak arayüz
- SimpleCoffee
- Temel nesne
- MilkDecorator
- Sarmalayıcı
- inner.cost()
- İç katmana delege
-
Decorator kurucusunu tamamla
public MilkDecorator(____ inner) { this.inner = inner; }
Cevabı göster
public MilkDecorator(Coffee inner) { this.inner = inner; }
Sıradaki ders: Özet - Tasarım desenleri