CodeBlanks Logo Icon CodeBlanks

Decorator

C# kursu · İleri seviye · Ders 65/83

Decorator deseniyle davranış genişletmeyi öğrenirsin.

Decorator deseni

Decorator, bir nesneyi aynı arayüze uyan bir sarmalayıcı içine koyarak davranışını kalıtım olmadan genişletir. İçteki nesneyi tutan bir alan, dışarıdan gelen çağrıları içe iletir ve ek davranış ekler.

Örnek: ICoffee arayüzü Cost() ve Description() metodlarını tanımlar. SimpleCoffee somut bileşendir. MilkDecorator bir ICoffee alır, maliyetine 0.50 ekler ve açıklamasına "Süt" katar. İç içe sararak "Sade + Süt + Şeker" gibi kombinasyonlar oluşturulur.

Uygulama MilkDecorator ile kahveyi sarmala

interface ICoffee tanımla; decimal Cost() ve string Description() metotları olsun. SimpleCoffee sınıfı Cost() için 10m, Description() için "Sade" döndürsün. MilkDecorator sınıfı bir ICoffee alsın, Cost() içten gelen değere 0.50m eklesin, Description() içtekinin sonuna " + Süt" katsın. Main'de new MilkDecorator(new SimpleCoffee()) oluşturup açıklama ve maliyeti "{description}: {cost}" biçiminde yazdır.

Örnek çözümü göster
ICoffee { public decimal Cost() => 10m; public string Description() => "Sade"; } yaz. MilkDecorator : ICoffee { private readonly ICoffee _inner; public MilkDecorator(ICoffee inner) => _inner = inner; public decimal Cost() => _inner.Cost() + 0.50m; public string Description() => _inner.Description() + " + Süt"; } yaz. Main'de: var c = new MilkDecorator(new SimpleCoffee()); Console.WriteLine($"{c.Description()}: {c.Cost()}");
Örnek çözüm:
using System;

interface ICoffee
{
    decimal Cost();
    string Description();
}

class SimpleCoffee : ICoffee
{
    public decimal Cost() => 10m;
    public string Description() => "Sade";
}

class MilkDecorator : ICoffee
{
    private readonly ICoffee _inner;
    public MilkDecorator(ICoffee inner) => _inner = inner;
    public decimal Cost() => _inner.Cost() + 0.50m;
    public string Description() => _inner.Description() + " + Süt";
}

class Program
{
    static void Main()
    {
        var coffee = new MilkDecorator(new SimpleCoffee());
        Console.WriteLine($"{coffee.Description()}: {coffee.Cost()}");
    }
}

Sarmalayıcı zinciri

Decorator'ün gücü, iç içe sarılabilmesinden gelir. new SugarDecorator(new MilkDecorator(new SimpleCoffee())) gibi bir zincir hem süt hem şeker ekler. Her katman içine gelen sonucu alır, kendi katkısını ekler ve dışa aktarır.

Kalıtımla aynı sonucu elde etmek için her kombinasyon için ayrı alt sınıf gerekir (CoffeeWithMilk, CoffeeWithSugar, CoffeeWithMilkAndSugar...). Decorator bu sınıf patlamasını önler.

Kendini test et

  1. Decorator deseni ne zaman kullanılır?

    • Sınıfı kalıtıma kapatmak için
    • Statik üye eklemek için
    • Davranışı kalıtım olmadan genişletmek için
    • Nesne sayısını sınırlamak için
    Cevabı göster

    Davranışı kalıtım olmadan genişletmek için — Doğru. Decorator sarmalayarak davranış ekler; alt sınıf sayısını artırmaz.

  2. İç nesne alanını tanımla

    private ____ ICoffee _inner;
    Cevabı göster
    private readonly ICoffee _inner;
  3. Decorator parçalarını eşleştir

    Component
    Ortak arayüz
    ConcreteComponent
    Sarmalanan asıl nesne
    Decorator
    Sarmalayan temel sınıf
    Wrapped
    İçerideki bileşen

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